blob: 6673fb3ee3a034bdf54de839cc6a9b2f220433bb [file] [log] [blame] [edit]
// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_CHROMEOS_CDM_FACTORY_H_
#define CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_CHROMEOS_CDM_FACTORY_H_
#include "base/component_export.h"
#include "base/functional/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/task/single_thread_task_runner.h"
#include "chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h"
#include "chromeos/components/cdm_factory_daemon/mojom/browser_cdm_factory.mojom.h"
#include "chromeos/components/cdm_factory_daemon/mojom/cdm_factory_daemon.mojom.h"
#include "media/base/cdm_config.h"
#include "media/base/cdm_context.h"
#include "media/base/cdm_factory.h"
#include "media/mojo/mojom/cdm_document_service.mojom.h"
#include "media/mojo/mojom/frame_interface_factory.mojom.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace chromeos {
// Provides an implementation of the media::CdmFactory interface which utilizes
// the chromeos::CdmFactoryDaemonProxy to establish a mojo connection to the
// CDM factory daemon in Chrome OS which it then uses to create a CDM
// implementation. The implementation will be used in the GPU process.
class COMPONENT_EXPORT(CDM_FACTORY_DAEMON) ChromeOsCdmFactory
: public media::CdmFactory {
public:
explicit ChromeOsCdmFactory(
media::mojom::FrameInterfaceFactory* frame_interfaces);
ChromeOsCdmFactory(const ChromeOsCdmFactory&) = delete;
ChromeOsCdmFactory& operator=(const ChromeOsCdmFactory&) = delete;
~ChromeOsCdmFactory() override;
// Invoked on GPU initialization to set the receiver to pass to the browser
// process.
static mojo::PendingReceiver<cdm::mojom::BrowserCdmFactory>
GetBrowserCdmFactoryReceiver();
// media::CdmFactory implementation.
void Create(
const media::CdmConfig& cdm_config,
const media::SessionMessageCB& session_message_cb,
const media::SessionClosedCB& session_closed_cb,
const media::SessionKeysChangeCB& session_keys_change_cb,
const media::SessionExpirationUpdateCB& session_expiration_update_cb,
media::CdmCreatedCB cdm_created_cb) override;
// Used to get hardware specific configuration data from the daemon to be used
// for setting up decrypt+decode in the GPU.
static void GetHwConfigData(ChromeOsCdmContext::GetHwConfigDataCB callback);
// Used to get screen resolutions from the browser process so we can optimize
// our decode target size.
static void GetScreenResolutions(
ChromeOsCdmContext::GetScreenResolutionsCB callback);
// Allocates a secure buffer with ARM TrustZone for the target of decryption.
static void AllocateSecureBuffer(
uint32_t size,
ChromeOsCdmContext::AllocateSecureBufferCB callback);
// Parses H264 slice header data referenced in TrustZone memory by
// |secure_handle|.
static void ParseEncryptedSliceHeader(
uint64_t secure_handle,
uint32_t offset,
const std::vector<uint8_t>& stream_data,
ChromeOsCdmContext::ParseEncryptedSliceHeaderCB callback);
// Invoked in the OOP Video Decoder utility process to set the Mojo connection
// back to the browser process. Normally the GPU process has a Mojo connection
// to the browser process for this purpose. When we launch an OOP Video
// Decoder Process from the browser process, we pass a mojo::Remote to it so
// the OOP Video Decoder process can then invoke cdm::mojom::BrowserCdmFactory
// calls that are received by the browser process just like they would if it
// was being handled in the GPU process.
static void SetBrowserCdmFactoryRemote(
mojo::Remote<cdm::mojom::BrowserCdmFactory> remote);
// Returns a singleton pointer that can be used as the media::CdmContext for
// ARC video decode operations.
static media::CdmContext* GetArcCdmContext();
private:
void OnVerifiedAccessEnabled(
const media::CdmConfig& cdm_config,
const media::SessionMessageCB& session_message_cb,
const media::SessionClosedCB& session_closed_cb,
const media::SessionKeysChangeCB& session_keys_change_cb,
const media::SessionExpirationUpdateCB& session_expiration_update_cb,
media::CdmCreatedCB cdm_created_cb,
bool enabled);
void OnCreateFactory(
const media::CdmConfig& cdm_config,
const media::SessionMessageCB& session_message_cb,
const media::SessionClosedCB& session_closed_cb,
const media::SessionKeysChangeCB& session_keys_change_cb,
const media::SessionExpirationUpdateCB& session_expiration_update_cb,
media::CdmCreatedCB cdm_created_cb,
mojo::PendingRemote<cdm::mojom::CdmFactory> remote_factory);
void CreateCdm(
const media::CdmConfig& cdm_config,
const media::SessionMessageCB& session_message_cb,
const media::SessionClosedCB& session_closed_cb,
const media::SessionKeysChangeCB& session_keys_change_cb,
const media::SessionExpirationUpdateCB& session_expiration_update_cb,
media::CdmCreatedCB cdm_created_cb);
void OnFactoryMojoConnectionError();
void OnVerificationMojoConnectionError();
raw_ptr<media::mojom::FrameInterfaceFactory> frame_interfaces_;
mojo::Remote<cdm::mojom::CdmFactory> remote_factory_;
mojo::Remote<media::mojom::CdmDocumentService> cdm_document_service_;
// WeakPtrFactory to use for callbacks.
base::WeakPtrFactory<ChromeOsCdmFactory> weak_factory_{this};
};
} // namespace chromeos
#endif // CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_CHROMEOS_CDM_FACTORY_H_