blob: 4672f80c0e3ca4d79e85d176b7a7438428cf664b [file] [log] [blame]
// Copyright 2022 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/remoting/device_capability_checker.h"
#include "base/strings/string_util.h"
#include "media/base/audio_codecs.h"
#include "media/base/video_codec_string_parsers.h"
#include "media/base/video_codecs.h"
namespace media::remoting {
bool IsKnownToSupportRemoting(const std::string& model_name) {
// This is a workaround to allowlist certain devices known to support
// remoting, so that we can only show media sinks that are known to work for
// remote playback.
//
// TODO(crbug.com/1380864): Use a better mechanism to feature detect remoting
// support before mirroring begins.
return base::StartsWith(model_name, "Chromecast",
base::CompareCase::SENSITIVE) ||
base::StartsWith(model_name, "Eureka Dongle",
base::CompareCase::SENSITIVE);
}
bool IsVideoCodecCompatible(const std::string& model_name,
VideoCodec video_codec) {
if (!IsKnownToSupportRemoting(model_name)) {
return false;
}
if (video_codec == VideoCodec::kH264 || video_codec == VideoCodec::kVP8) {
return true;
}
if (model_name == "Chromecast Ultra" &&
(video_codec == VideoCodec::kHEVC || video_codec == VideoCodec::kVP9)) {
return true;
}
return false;
}
bool IsAudioCodecCompatible(const std::string& model_name,
AudioCodec audio_codec) {
if (!IsKnownToSupportRemoting(model_name)) {
return false;
}
return (audio_codec == AudioCodec::kAAC) ||
(audio_codec == AudioCodec::kOpus);
}
media::VideoCodec ParseVideoCodec(const std::string& codec_str) {
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
// `StringToVideoCodec()` does not parse custom strings like "hevc" and
// "h264".
if (codec_str == "hevc") {
return media::VideoCodec::kHEVC;
}
if (codec_str == "h264") {
return media::VideoCodec::kH264;
}
#endif
return media::StringToVideoCodec(codec_str);
}
media::AudioCodec ParseAudioCodec(const std::string& codec_str) {
if (codec_str == "aac") {
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
return media::AudioCodec::kAAC;
#else
return media::AudioCodec::kUnknown;
#endif
}
return media::StringToAudioCodec(codec_str);
}
} // namespace media::remoting