blob: 36f7a645d37388d3f9f5bddadedaa248486c8b7b [file] [log] [blame]
// Copyright 2014 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/cdm/renderer/android_key_systems.h"
#include <memory>
#include <string>
#include <vector>
#include "base/check.h"
#include "base/logging.h"
#include "components/cdm/renderer/android_key_system_info.h"
#include "content/public/renderer/render_thread.h"
#include "media/base/content_decryption_module.h"
#include "media/base/eme_constants.h"
#include "media/base/media_switches.h"
#include "media/media_buildflags.h"
#if BUILDFLAG(ENABLE_WIDEVINE)
#include "components/cdm/renderer/widevine_key_system_info.h"
#include "third_party/widevine/cdm/widevine_cdm_common.h" // nogncheck
#endif // BUILDFLAG(ENABLE_WIDEVINE)
using media::CdmSessionType;
using media::EmeFeatureSupport;
using media::EncryptionScheme;
using media::KeySystemInfo;
using media::KeySystemInfos;
#if BUILDFLAG(ENABLE_WIDEVINE)
using Robustness = cdm::WidevineKeySystemInfo::Robustness;
#endif // BUILDFLAG(ENABLE_WIDEVINE)
namespace cdm {
SupportedKeySystemResponse QueryKeySystemSupport(
const std::string& key_system) {
SupportedKeySystemRequest request;
SupportedKeySystemResponse response;
request.key_system = key_system;
request.codecs = media::EME_CODEC_ALL;
content::RenderThread::Get()->Send(
new ChromeViewHostMsg_QueryKeySystemSupport(request, &response));
DCHECK(!(response.non_secure_codecs & ~media::EME_CODEC_ALL))
<< "unrecognized codec";
DCHECK(!(response.secure_codecs & ~media::EME_CODEC_ALL))
<< "unrecognized codec";
return response;
}
#if BUILDFLAG(ENABLE_WIDEVINE)
void AddAndroidWidevine(KeySystemInfos* key_systems) {
// TODO(crbug.com/853336): Use media.mojom.KeySystemSupport instead of
// separate IPC.
auto response = QueryKeySystemSupport(kWidevineKeySystem);
auto codecs = response.non_secure_codecs;
// On Android, ".secure" codecs are all hardware secure codecs.
auto hw_secure_codecs = response.secure_codecs;
if (codecs == media::EME_CODEC_NONE) {
// It doesn't make sense to support hw secure codecs but not regular codecs.
DCHECK(hw_secure_codecs == media::EME_CODEC_NONE);
DVLOG(3) << __func__ << " Widevine NOT supported.";
return;
}
DVLOG(3) << __func__ << " Widevine supported.";
base::flat_set<EncryptionScheme> encryption_schemes = {
EncryptionScheme::kCenc};
if (response.is_cbcs_encryption_supported) {
encryption_schemes.insert(EncryptionScheme::kCbcs);
}
base::flat_set<CdmSessionType> session_types = {CdmSessionType::kTemporary};
if (response.is_persistent_license_supported) {
session_types.insert(CdmSessionType::kPersistentLicense);
}
// Since we do not control the implementation of the MediaDrm API on Android,
// we assume that it can and will make use of persistence no matter whether
// persistence-based features are supported or not.
key_systems->emplace_back(new WidevineKeySystemInfo(
codecs, // Regular codecs.
encryption_schemes, // Encryption schemes.
session_types, // Session types.
hw_secure_codecs, // Hardware secure codecs.
encryption_schemes, // Hardware secure encryption schemes.
session_types, // Hardware secure Session types.
Robustness::HW_SECURE_CRYPTO, // Max audio robustness.
Robustness::HW_SECURE_ALL, // Max video robustness.
EmeFeatureSupport::ALWAYS_ENABLED, // Persistent state.
EmeFeatureSupport::ALWAYS_ENABLED)); // Distinctive identifier.
}
#endif // BUILDFLAG(ENABLE_WIDEVINE)
void AddAndroidPlatformKeySystems(KeySystemInfos* key_systems) {
// TODO(crbug.com/853336): Update media.mojom.KeySystemSupport to handle this
// case and use it instead.
std::vector<std::string> key_system_names;
content::RenderThread::Get()->Send(
new ChromeViewHostMsg_GetPlatformKeySystemNames(&key_system_names));
const base::flat_set<media::EncryptionScheme> encryption_schemes = {
EncryptionScheme::kCenc};
for (const auto& key_system : key_system_names) {
SupportedKeySystemResponse response = QueryKeySystemSupport(key_system);
if (response.non_secure_codecs != media::EME_CODEC_NONE) {
key_systems->emplace_back(std::make_unique<AndroidKeySystemInfo>(
key_system, response.non_secure_codecs, encryption_schemes,
media::EME_CODEC_NONE, encryption_schemes));
}
}
}
} // namespace cdm