blob: e9106a498b60b49fbd4e4ffb58137bb9e0b5010e [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "media/cast/openscreen/config_conversions.h"
#include "base/containers/contains.h"
#include "media/base/media_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/openscreen/src/cast/streaming/capture_configs.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
namespace media::cast {
namespace {
void ValidateAudioConfig(const media::AudioDecoderConfig& config,
const media::AudioDecoderConfig& expected) {
EXPECT_EQ(config.codec(), expected.codec());
EXPECT_EQ(config.sample_format(), media::SampleFormat::kSampleFormatF32);
EXPECT_EQ(config.channel_layout(), expected.channel_layout());
EXPECT_EQ(config.samples_per_second(), expected.samples_per_second());
EXPECT_EQ(config.extra_data().size(), size_t{0});
EXPECT_FALSE(config.is_encrypted());
}
void ValidateAudioConfig(const openscreen::cast::AudioCaptureConfig& config,
const openscreen::cast::AudioCaptureConfig& expected) {
EXPECT_EQ(config.codec, expected.codec);
EXPECT_EQ(config.channels, expected.channels);
EXPECT_EQ(config.bit_rate, expected.bit_rate);
EXPECT_EQ(config.sample_rate, expected.sample_rate);
EXPECT_EQ(config.target_playout_delay, expected.target_playout_delay);
}
void ValidateVideoConfig(const media::VideoDecoderConfig& config,
const media::VideoDecoderConfig& expected) {
EXPECT_EQ(config.codec(), expected.codec());
EXPECT_EQ(config.profile(), expected.profile());
EXPECT_EQ(config.alpha_mode(),
media::VideoDecoderConfig::AlphaMode::kIsOpaque);
EXPECT_EQ(config.extra_data().size(), size_t{0});
EXPECT_FALSE(config.is_encrypted());
EXPECT_EQ(config.coded_size().width(), expected.coded_size().width());
EXPECT_EQ(config.coded_size().height(), expected.coded_size().height());
EXPECT_EQ(config.visible_rect().width(), expected.visible_rect().width());
EXPECT_EQ(config.visible_rect().height(), expected.visible_rect().height());
EXPECT_EQ(config.natural_size().width(), expected.natural_size().width());
EXPECT_EQ(config.natural_size().height(), expected.natural_size().height());
}
void ValidateVideoConfig(const openscreen::cast::VideoCaptureConfig& config,
const openscreen::cast::VideoCaptureConfig& expected) {
EXPECT_EQ(config.codec, expected.codec);
EXPECT_EQ(config.max_frame_rate, expected.max_frame_rate);
EXPECT_EQ(config.max_bit_rate, expected.max_bit_rate);
EXPECT_EQ(config.target_playout_delay, expected.target_playout_delay);
ASSERT_EQ(config.resolutions.size(), expected.resolutions.size());
for (const auto& resolution : config.resolutions) {
EXPECT_TRUE(base::Contains(expected.resolutions, resolution));
}
}
openscreen::cast::AudioCaptureConfig CreateAudioCaptureConfig() {
openscreen::cast::AudioCaptureConfig config;
config.codec = openscreen::cast::AudioCodec::kAac;
config.channels = 2;
config.sample_rate = 42;
return config;
}
media::AudioDecoderConfig CreateAudioDecoderConfig(
media::AudioCodec codec,
media::ChannelLayout channel_layout,
int samples_per_second) {
return media::AudioDecoderConfig(codec, media::SampleFormat::kSampleFormatF32,
channel_layout, samples_per_second,
media::EmptyExtraData(),
media::EncryptionScheme::kUnencrypted);
}
openscreen::cast::VideoCaptureConfig CreateVideoCaptureConfig() {
openscreen::cast::VideoCaptureConfig config;
config.codec = openscreen::cast::VideoCodec::kH264;
config.resolutions.push_back({1080, 720});
return config;
}
media::VideoDecoderConfig CreateVideoDecoderConfig(
media::VideoCodec codec,
media::VideoCodecProfile codec_profile,
int width,
int height) {
gfx::Size video_size(width, height);
gfx::Rect video_rect(width, height);
return media::VideoDecoderConfig(
codec, codec_profile, media::VideoDecoderConfig::AlphaMode::kIsOpaque,
media::VideoColorSpace(), media::VideoTransformation(), video_size,
video_rect, video_size, media::EmptyExtraData(),
media::EncryptionScheme::kUnencrypted);
}
} // namespace
TEST(ConfigConversionsTest, AudioConfigCodecConversion) {
auto capture_config = CreateAudioCaptureConfig();
auto decoder_config = CreateAudioDecoderConfig(
media::AudioCodec::kAAC, media::ChannelLayout::CHANNEL_LAYOUT_STEREO, 42);
ValidateAudioConfig(ToAudioDecoderConfig(capture_config), decoder_config);
ValidateAudioConfig(ToAudioCaptureConfig(decoder_config), capture_config);
capture_config.codec = openscreen::cast::AudioCodec::kOpus;
decoder_config =
CreateAudioDecoderConfig(media::AudioCodec::kOpus,
media::ChannelLayout::CHANNEL_LAYOUT_STEREO, 42);
ValidateAudioConfig(ToAudioDecoderConfig(capture_config), decoder_config);
ValidateAudioConfig(ToAudioCaptureConfig(decoder_config), capture_config);
}
TEST(ConfigConversionsTest, AudioConfigChannelsConversion) {
auto capture_config = CreateAudioCaptureConfig();
auto decoder_config = CreateAudioDecoderConfig(
media::AudioCodec::kAAC, media::ChannelLayout::CHANNEL_LAYOUT_STEREO, 42);
ValidateAudioConfig(ToAudioDecoderConfig(capture_config), decoder_config);
ValidateAudioConfig(ToAudioCaptureConfig(decoder_config), capture_config);
capture_config.channels = 1;
decoder_config = CreateAudioDecoderConfig(
media::AudioCodec::kAAC, media::ChannelLayout::CHANNEL_LAYOUT_MONO, 42);
ValidateAudioConfig(ToAudioDecoderConfig(capture_config), decoder_config);
ValidateAudioConfig(ToAudioCaptureConfig(decoder_config), capture_config);
// Other configurations are not expected in practice.
}
TEST(ConfigConversionsTest, AudioConfigSampleRateConversion) {
auto capture_config = CreateAudioCaptureConfig();
auto decoder_config = CreateAudioDecoderConfig(
media::AudioCodec::kAAC, media::ChannelLayout::CHANNEL_LAYOUT_STEREO, 42);
ValidateAudioConfig(ToAudioDecoderConfig(capture_config), decoder_config);
ValidateAudioConfig(ToAudioCaptureConfig(decoder_config), capture_config);
capture_config.sample_rate = 1234;
decoder_config = CreateAudioDecoderConfig(
media::AudioCodec::kAAC, media::ChannelLayout::CHANNEL_LAYOUT_STEREO,
1234);
ValidateAudioConfig(ToAudioDecoderConfig(capture_config), decoder_config);
ValidateAudioConfig(ToAudioCaptureConfig(decoder_config), capture_config);
capture_config.sample_rate = -1;
decoder_config = CreateAudioDecoderConfig(
media::AudioCodec::kAAC, media::ChannelLayout::CHANNEL_LAYOUT_STEREO, -1);
ValidateAudioConfig(ToAudioDecoderConfig(capture_config), decoder_config);
ValidateAudioConfig(ToAudioCaptureConfig(decoder_config), capture_config);
capture_config.sample_rate = 0;
decoder_config = CreateAudioDecoderConfig(
media::AudioCodec::kAAC, media::ChannelLayout::CHANNEL_LAYOUT_STEREO, 0);
ValidateAudioConfig(ToAudioDecoderConfig(capture_config), decoder_config);
ValidateAudioConfig(ToAudioCaptureConfig(decoder_config), capture_config);
}
TEST(ConfigConversionsTest, VideoConfigCodecConversion) {
const int width = 1080;
const int height = 720;
auto capture_config = CreateVideoCaptureConfig();
auto decoder_config = CreateVideoDecoderConfig(
media::VideoCodec::kH264, media::VideoCodecProfile::H264PROFILE_BASELINE,
width, height);
ValidateVideoConfig(ToVideoDecoderConfig(capture_config), decoder_config);
ValidateVideoConfig(ToVideoCaptureConfig(decoder_config), capture_config);
capture_config.codec = openscreen::cast::VideoCodec::kVp8;
decoder_config = CreateVideoDecoderConfig(
media::VideoCodec::kVP8, media::VideoCodecProfile::VP8PROFILE_MIN, width,
height);
ValidateVideoConfig(ToVideoDecoderConfig(capture_config), decoder_config);
ValidateVideoConfig(ToVideoCaptureConfig(decoder_config), capture_config);
capture_config.codec = openscreen::cast::VideoCodec::kHevc;
decoder_config = CreateVideoDecoderConfig(
media::VideoCodec::kHEVC, media::VideoCodecProfile::HEVCPROFILE_MAIN,
width, height);
ValidateVideoConfig(ToVideoDecoderConfig(capture_config), decoder_config);
ValidateVideoConfig(ToVideoCaptureConfig(decoder_config), capture_config);
capture_config.codec = openscreen::cast::VideoCodec::kVp9;
decoder_config = CreateVideoDecoderConfig(
media::VideoCodec::kVP9, media::VideoCodecProfile::VP9PROFILE_PROFILE0,
width, height);
ValidateVideoConfig(ToVideoDecoderConfig(capture_config), decoder_config);
ValidateVideoConfig(ToVideoCaptureConfig(decoder_config), capture_config);
}
TEST(ConfigConversionsTest, VideoConfigResolutionConversion) {
auto capture_config = CreateVideoCaptureConfig();
auto decoder_config = CreateVideoDecoderConfig(
media::VideoCodec::kH264, media::VideoCodecProfile::H264PROFILE_BASELINE,
1080, 720);
ValidateVideoConfig(ToVideoDecoderConfig(capture_config), decoder_config);
ValidateVideoConfig(ToVideoCaptureConfig(decoder_config), capture_config);
ASSERT_EQ(capture_config.resolutions.size(), size_t{1});
capture_config.resolutions[0].width = 42;
capture_config.resolutions[0].height = 16;
decoder_config = CreateVideoDecoderConfig(
media::VideoCodec::kH264, media::VideoCodecProfile::H264PROFILE_BASELINE,
42, 16);
ValidateVideoConfig(ToVideoDecoderConfig(capture_config), decoder_config);
ValidateVideoConfig(ToVideoCaptureConfig(decoder_config), capture_config);
capture_config.resolutions[0].width = 1;
capture_config.resolutions[0].height = 2;
decoder_config = CreateVideoDecoderConfig(
media::VideoCodec::kH264, media::VideoCodecProfile::H264PROFILE_BASELINE,
1, 2);
ValidateVideoConfig(ToVideoDecoderConfig(capture_config), decoder_config);
ValidateVideoConfig(ToVideoCaptureConfig(decoder_config), capture_config);
capture_config.resolutions[0].width = 0;
capture_config.resolutions[0].height = 0;
decoder_config = CreateVideoDecoderConfig(
media::VideoCodec::kH264, media::VideoCodecProfile::H264PROFILE_BASELINE,
0, 0);
ValidateVideoConfig(ToVideoDecoderConfig(capture_config), decoder_config);
ValidateVideoConfig(ToVideoCaptureConfig(decoder_config), capture_config);
}
} // namespace media::cast