#ifndef MEDIA_CDM_SUPPORTED_CDM_VERSIONS_H_
#define MEDIA_CDM_SUPPORTED_CDM_VERSIONS_H_
#include <stddef.h>
#include <array>
#include "media/base/media_export.h"
#include "media/cdm/api/content_decryption_module.h"
namespace media {
struct SupportedVersion {
int version;
bool enabled;
};
constexpr std::array<SupportedVersion, 3> kSupportedCdmInterfaceVersions = {{
{10, true},
{11, true},
{12, false},
}};
constexpr int kMinSupportedCdmHostVersion = 10;
constexpr int kMaxSupportedCdmHostVersion = 12;
constexpr bool IsSupportedCdmModuleVersion(int version) {
return version == CDM_MODULE_VERSION;
}
constexpr bool IsSupportedCdmInterfaceVersion(int version) {
for (size_t i = 0; i < kSupportedCdmInterfaceVersions.size(); ++i) {
if (kSupportedCdmInterfaceVersions[i].version == version)
return true;
}
return false;
}
constexpr bool IsSupportedCdmHostVersion(int version) {
return kMinSupportedCdmHostVersion <= version &&
version <= kMaxSupportedCdmHostVersion;
}
constexpr bool IsCdmInterfaceVersionEnabledByDefault(int version) {
for (size_t i = 0; i < kSupportedCdmInterfaceVersions.size(); ++i) {
if (kSupportedCdmInterfaceVersions[i].version == version)
return kSupportedCdmInterfaceVersions[i].enabled;
}
return false;
}
MEDIA_EXPORT bool IsSupportedAndEnabledCdmInterfaceVersion(int version);
typedef bool (*VersionCheckFunc)(int version);
constexpr bool CheckVersions(VersionCheckFunc check_func,
int min_version,
int max_version) {
if (check_func(min_version - 1) || check_func(max_version + 1))
return false;
for (int version = min_version; version <= max_version; ++version) {
if (!check_func(version))
return false;
}
return true;
}
constexpr bool CheckSupportedCdmInterfaceVersions(int min_version,
int max_version) {
return CheckVersions(IsSupportedCdmInterfaceVersion, min_version,
max_version);
}
constexpr bool CheckSupportedCdmHostVersions(int min_version, int max_version) {
return CheckVersions(IsSupportedCdmHostVersion, min_version, max_version);
}
template <int CdmInterfaceVersion>
struct CdmInterfaceTraits {};
template <>
struct CdmInterfaceTraits<10> {
using CdmInterface = cdm::ContentDecryptionModule_10;
static_assert(CdmInterface::kVersion == 10, "CDM interface version mismatch");
static_assert(IsSupportedCdmHostVersion(CdmInterface::Host::kVersion),
"Host not supported");
static_assert(
CdmInterface::kIsStable ||
!IsCdmInterfaceVersionEnabledByDefault(CdmInterface::kVersion),
"Experimental CDM interface should not be enabled by default");
};
template <>
struct CdmInterfaceTraits<11> {
using CdmInterface = cdm::ContentDecryptionModule_11;
static_assert(CdmInterface::kVersion == 11, "CDM interface version mismatch");
static_assert(IsSupportedCdmHostVersion(CdmInterface::Host::kVersion),
"Host not supported");
static_assert(
CdmInterface::kIsStable ||
!IsCdmInterfaceVersionEnabledByDefault(CdmInterface::kVersion),
"Experimental CDM interface should not be enabled by default");
};
template <>
struct CdmInterfaceTraits<12> {
using CdmInterface = cdm::ContentDecryptionModule_12;
static_assert(CdmInterface::kVersion == 12, "CDM interface version mismatch");
static_assert(IsSupportedCdmHostVersion(CdmInterface::Host::kVersion),
"Host not supported");
static_assert(
CdmInterface::kIsStable ||
!IsCdmInterfaceVersionEnabledByDefault(CdmInterface::kVersion),
"Experimental CDM interface should not be enabled by default");
};
}
#endif