#include "media/mojo/clients/mojo_cdm.h"
#include <stddef.h>
#include <utility>
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/location.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/task/single_thread_task_runner.h"
#include "base/types/optional_util.h"
#include "build/build_config.h"
#include "media/base/callback_timeout_helpers.h"
#include "media/base/cdm_context.h"
#include "media/base/cdm_key_information.h"
#include "media/base/cdm_promise.h"
#include "media/base/key_systems.h"
#include "media/media_buildflags.h"
#include "media/mojo/clients/mojo_decryptor.h"
#include "media/mojo/common/media_type_converters.h"
#include "media/mojo/mojom/decryptor.mojom.h"
#include "services/service_manager/public/cpp/connect.h"
#include "services/service_manager/public/mojom/interface_provider.mojom.h"
namespace media {
namespace {
void RecordConnectionError(bool connection_error_happened) { … }
void OnCallbackTimeout(const std::string& uma_name,
bool called_on_destruction) { … }
constexpr auto kMojoCdmTimeout = …;
}
MojoCdm::MojoCdm(mojo::Remote<mojom::ContentDecryptionModule> remote_cdm,
media::mojom::CdmContextPtr cdm_context,
const CdmConfig& cdm_config,
const SessionMessageCB& session_message_cb,
const SessionClosedCB& session_closed_cb,
const SessionKeysChangeCB& session_keys_change_cb,
const SessionExpirationUpdateCB& session_expiration_update_cb)
: … { … }
MojoCdm::~MojoCdm() { … }
void MojoCdm::OnConnectionError(uint32_t custom_reason,
const std::string& description) { … }
void MojoCdm::SetServerCertificate(const std::vector<uint8_t>& certificate,
std::unique_ptr<SimpleCdmPromise> promise) { … }
void MojoCdm::GetStatusForPolicy(HdcpVersion min_hdcp_version,
std::unique_ptr<KeyStatusCdmPromise> promise) { … }
void MojoCdm::CreateSessionAndGenerateRequest(
CdmSessionType session_type,
EmeInitDataType init_data_type,
const std::vector<uint8_t>& init_data,
std::unique_ptr<NewSessionCdmPromise> promise) { … }
void MojoCdm::LoadSession(CdmSessionType session_type,
const std::string& session_id,
std::unique_ptr<NewSessionCdmPromise> promise) { … }
void MojoCdm::UpdateSession(const std::string& session_id,
const std::vector<uint8_t>& response,
std::unique_ptr<SimpleCdmPromise> promise) { … }
void MojoCdm::CloseSession(const std::string& session_id,
std::unique_ptr<SimpleCdmPromise> promise) { … }
void MojoCdm::RemoveSession(const std::string& session_id,
std::unique_ptr<SimpleCdmPromise> promise) { … }
CdmContext* MojoCdm::GetCdmContext() { … }
std::unique_ptr<CallbackRegistration> MojoCdm::RegisterEventCB(
EventCB event_cb) { … }
Decryptor* MojoCdm::GetDecryptor() { … }
std::optional<base::UnguessableToken> MojoCdm::GetCdmId() const { … }
#if BUILDFLAG(IS_WIN)
bool MojoCdm::RequiresMediaFoundationRenderer() {
base::AutoLock auto_lock(lock_);
DVLOG(2) << __func__ << ": requires_media_foundation_renderer_="
<< requires_media_foundation_renderer_;
return requires_media_foundation_renderer_;
}
#endif
void MojoCdm::OnSessionMessage(const std::string& session_id,
MessageType message_type,
const std::vector<uint8_t>& message) { … }
void MojoCdm::OnSessionClosed(const std::string& session_id,
CdmSessionClosedReason reason) { … }
void MojoCdm::OnSessionKeysChange(
const std::string& session_id,
bool has_additional_usable_key,
std::vector<std::unique_ptr<CdmKeyInformation>> keys_info) { … }
void MojoCdm::OnSessionExpirationUpdate(const std::string& session_id,
double new_expiry_time_sec) { … }
void MojoCdm::OnSimpleCdmPromiseResult(uint32_t promise_id,
mojom::CdmPromiseResultPtr result) { … }
void MojoCdm::OnKeyStatusCdmPromiseResult(
uint32_t promise_id,
mojom::CdmPromiseResultPtr result,
CdmKeyInformation::KeyStatus key_status) { … }
void MojoCdm::OnNewSessionCdmPromiseResult(uint32_t promise_id,
mojom::CdmPromiseResultPtr result,
const std::string& session_id) { … }
void MojoCdm::RejectPromiseConnectionLost(uint32_t promise_id) { … }
}