mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-12-02 18:08:58 +00:00
28ab226d21
Differential Revision: https://phabricator.services.mozilla.com/D200985
83 lines
2.5 KiB
C++
83 lines
2.5 KiB
C++
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "WMFClearKeyCDMFactory.h"
|
|
|
|
#include <string>
|
|
|
|
#include <Mferror.h>
|
|
|
|
#include "WMFClearKeyCDMAccess.h"
|
|
#include "WMFClearKeyUtils.h"
|
|
|
|
namespace mozilla {
|
|
|
|
using Microsoft::WRL::MakeAndInitialize;
|
|
|
|
ActivatableClass(WMFClearKeyCDMFactory);
|
|
|
|
bool isRequiringHDCP22OrAbove(LPCWSTR aType) {
|
|
if (aType == nullptr || *aType == L'\0') {
|
|
return false;
|
|
}
|
|
|
|
// The HDCP value follows the feature value in
|
|
// https://docs.microsoft.com/en-us/uwp/api/windows.media.protection.protectioncapabilities.istypesupported?view=winrt-19041
|
|
// - 1 (on without HDCP 2.2 Type 1 restriction)
|
|
// - 2 (on with HDCP 2.2 Type 1 restriction)
|
|
std::wstring wstr(aType);
|
|
std::string hdcpStr(wstr.begin(), wstr.end());
|
|
return wstr.find(L"hdcp=2") != std::string::npos;
|
|
}
|
|
|
|
STDMETHODIMP_(BOOL)
|
|
WMFClearKeyCDMFactory::IsTypeSupported(_In_ LPCWSTR aKeySystem,
|
|
_In_opt_ LPCWSTR aContentType) {
|
|
// For testing, return support for most of cases. Only returns false for some
|
|
// special cases.
|
|
|
|
bool needHDCP22OrAbove = isRequiringHDCP22OrAbove(aContentType);
|
|
ENTRY_LOG_ARGS("Need-HDCP2.2+=%d", needHDCP22OrAbove);
|
|
|
|
// As the API design of the Media Foundation, we can only know whether the
|
|
// requester is asking for HDCP 2.2+ or not, we can't know the exact HDCP
|
|
// version which is used in getStatusPolicy web api. Therefore, we pretend
|
|
// ourselves only having HDCP 2.1 compliant.
|
|
if (needHDCP22OrAbove) {
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
STDMETHODIMP
|
|
WMFClearKeyCDMFactory::CreateContentDecryptionModuleAccess(
|
|
LPCWSTR aKeySystem, IPropertyStore** aConfigurations,
|
|
DWORD aNumConfigurations, IMFContentDecryptionModuleAccess** aCdmAccess) {
|
|
ENTRY_LOG();
|
|
if (aKeySystem == nullptr || aKeySystem[0] == L'\0') {
|
|
ENTRY_LOG_ARGS("Key system is null or empty");
|
|
return MF_TYPE_ERR;
|
|
}
|
|
|
|
if (aNumConfigurations == 0) {
|
|
ENTRY_LOG_ARGS("No available configration");
|
|
return MF_TYPE_ERR;
|
|
}
|
|
|
|
if (!IsTypeSupported(aKeySystem, nullptr)) {
|
|
ENTRY_LOG_ARGS("Not supported type");
|
|
return MF_NOT_SUPPORTED_ERR;
|
|
}
|
|
|
|
RETURN_IF_FAILED((
|
|
MakeAndInitialize<WMFClearKeyCDMAccess, IMFContentDecryptionModuleAccess>(
|
|
aCdmAccess)));
|
|
ENTRY_LOG_ARGS("Created CDM access!");
|
|
return S_OK;
|
|
}
|
|
|
|
#undef LOG
|
|
|
|
} // namespace mozilla
|