// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "media/mojo/services/cdm_service.h" #include <utility> #include "base/functional/bind.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "media/base/cdm_factory.h" #include "media/mojo/services/mojo_cdm_service.h" #include "media/mojo/services/mojo_cdm_service_context.h" #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/bindings/unique_receiver_set.h" namespace media { namespace { // Implementation of mojom::CdmFactory that creates and hosts MojoCdmServices // which then host CDMs created by the media::CdmFactory provided by the // CdmService::Client. // // Lifetime Note: // 1. CdmFactoryImpl instances are owned by a DeferredDestroyUniqueReceiverSet // directly, which is owned by CdmService. // 2. CdmFactoryImpl is destroyed in any of the following two cases: // - CdmService is destroyed. Because of (2) this should not happen except for // during browser shutdown, when the Cdservice could be destroyed directly, // ignoring any outstanding interface connections. // - mojo::CdmFactory disconnection happens, AND CdmFactoryImpl doesn't own // any CDMs (|cdm_receivers_| is empty). This is to prevent destroying the // CDMs too early (e.g. during page navigation) which could cause errors // (session closed) on the client side. See https://crbug.com/821171 for // details. class CdmFactoryImpl final : public DeferredDestroy<mojom::CdmFactory> { … }; } // namespace CdmService::CdmService(std::unique_ptr<Client> client, mojo::PendingReceiver<mojom::CdmService> receiver) : … { … } CdmService::~CdmService() { … } void CdmService::CreateCdmFactory( mojo::PendingReceiver<mojom::CdmFactory> receiver, mojo::PendingRemote<mojom::FrameInterfaceFactory> frame_interfaces) { … } } // namespace media