| // 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_CDM_FACTORY_DAEMON_PROXY_ASH_H_ |
| #define CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_CDM_FACTORY_DAEMON_PROXY_ASH_H_ |
| |
| #include "chromeos/components/cdm_factory_daemon/cdm_factory_daemon_proxy.h" |
| |
| #include "base/component_export.h" |
| #include "chromeos/components/cdm_factory_daemon/mojom/cdm_factory_daemon.mojom.h" |
| #include "chromeos/components/cdm_factory_daemon/output_protection_impl.h" |
| #include "mojo/public/cpp/bindings/pending_receiver.h" |
| #include "mojo/public/cpp/bindings/pending_remote.h" |
| |
| namespace chromeos { |
| |
| // This class serves two purposes. |
| // 1. Allow the GPU process to call into the browser process to get the Mojo CDM |
| // Factory interface on the daemon. |
| // 2. Allow ArcBridge to get the OemCrypto Mojo interface from that same daemon. |
| // |
| // Since both of these mojo connections are to the same daemon, they need to be |
| // bootstrapped together on one higher level interface. This is done by using |
| // D-Bus to first bootstrap our connection to the daemon. Then over that |
| // interface we request the CdmFactory and pass it back via Mojo to |
| // the GPU process, or we request the OemCrypto interface and pass that back to |
| // ArcBridge. |
| class COMPONENT_EXPORT(CDM_FACTORY_DAEMON) CdmFactoryDaemonProxyAsh |
| : public CdmFactoryDaemonProxy { |
| public: |
| CdmFactoryDaemonProxyAsh(); |
| |
| CdmFactoryDaemonProxyAsh(const CdmFactoryDaemonProxyAsh&) = delete; |
| CdmFactoryDaemonProxyAsh& operator=(const CdmFactoryDaemonProxyAsh&) = delete; |
| |
| ~CdmFactoryDaemonProxyAsh() override; |
| |
| static void Create(mojo::PendingReceiver<BrowserCdmFactory> receiver); |
| |
| static CdmFactoryDaemonProxyAsh& GetInstance(); |
| |
| // Used to create a backing implementation of the |
| // cdm::mojom::BrowserCdmFactory that will proxy all calls to the browser |
| // process. This is used to create a mojo::PendingRemote that can be passed |
| // to an OOP video decoder. |
| static std::unique_ptr<cdm::mojom::BrowserCdmFactory> |
| CreateBrowserCdmFactoryProxy(); |
| |
| void ConnectOemCrypto( |
| mojo::PendingReceiver<arc::mojom::OemCryptoService> oemcryptor, |
| mojo::PendingRemote<arc::mojom::ProtectedBufferManager> |
| protected_buffer_manager, |
| mojo::PendingRemote<cdm::mojom::OutputProtection> output_protection); |
| void GetHdcp14Key( |
| cdm::mojom::CdmFactoryDaemon::GetHdcp14KeyCallback callback); |
| |
| // chromeos::cdm::mojom::BrowserCdmFactoryDaemon: |
| void CreateFactory(const std::string& key_system, |
| CreateFactoryCallback callback) override; |
| void GetHwConfigData(GetHwConfigDataCallback callback) override; |
| void GetOutputProtection(mojo::PendingReceiver<cdm::mojom::OutputProtection> |
| output_protection) override; |
| void GetScreenResolutions(GetScreenResolutionsCallback callback) override; |
| void GetAndroidHwKeyData(const std::vector<uint8_t>& key_id, |
| const std::vector<uint8_t>& hw_identifier, |
| GetAndroidHwKeyDataCallback callback) override; |
| void AllocateSecureBuffer(uint32_t size, |
| AllocateSecureBufferCallback callback) override; |
| void ParseEncryptedSliceHeader( |
| uint64_t secure_handle, |
| uint32_t offset, |
| const std::vector<uint8_t>& stream_data, |
| ParseEncryptedSliceHeaderCallback callback) override; |
| |
| private: |
| void EstablishDaemonConnection(base::OnceClosure callback); |
| void GetFactoryInterface(const std::string& key_system, |
| CreateFactoryCallback callback); |
| void ProxyGetHwConfigData(GetHwConfigDataCallback callback); |
| void ProxyGetAndroidHwKeyData(const std::vector<uint8_t>& key_id, |
| const std::vector<uint8_t>& hw_identifier, |
| GetAndroidHwKeyDataCallback callback); |
| void ProxyAllocateSecureBuffer(uint32_t size, |
| AllocateSecureBufferCallback callback); |
| void ProxyParseEncryptedSliceHeader( |
| uint64_t secure_handle, |
| uint32_t offset, |
| const std::vector<uint8_t>& stream_data, |
| ParseEncryptedSliceHeaderCallback callback); |
| void SendDBusRequest(base::ScopedFD fd, base::OnceClosure callback); |
| void OnBootstrapMojoConnection(base::OnceClosure callback, bool result); |
| void CompleteOemCryptoConnection( |
| mojo::PendingReceiver<arc::mojom::OemCryptoService> oemcryptor, |
| mojo::PendingRemote<arc::mojom::ProtectedBufferManager> |
| protected_buffer_manager, |
| mojo::PendingRemote<cdm::mojom::OutputProtection> output_protection); |
| void OnDaemonMojoConnectionError(); |
| |
| mojo::Remote<cdm::mojom::CdmFactoryDaemon> daemon_remote_; |
| |
| // This is used when the chrome flag is set to always enable HDCP. |
| std::unique_ptr<OutputProtectionImpl> forced_output_protection_; |
| }; |
| |
| } // namespace chromeos |
| |
| #endif // CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_CDM_FACTORY_DAEMON_PROXY_ASH_H_ |