blob: cf24954b99f5b7012169aa82cf3d5c5097dc4b9c [file] [log] [blame]
// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_MOJO_SERVICES_INTERFACE_FACTORY_IMPL_H_
#define MEDIA_MOJO_SERVICES_INTERFACE_FACTORY_IMPL_H_
#include <memory>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/unguessable_token.h"
#include "build/build_config.h"
#include "media/base/media_util.h"
#include "media/media_buildflags.h"
#include "media/mojo/buildflags.h"
#include "media/mojo/mojom/audio_decoder.mojom.h"
#include "media/mojo/mojom/content_decryption_module.mojom.h"
#include "media/mojo/mojom/decryptor.mojom.h"
#include "media/mojo/mojom/frame_interface_factory.mojom.h"
#include "media/mojo/mojom/interface_factory.mojom.h"
#include "media/mojo/mojom/media_log.mojom.h"
#include "media/mojo/mojom/renderer.mojom.h"
#include "media/mojo/mojom/video_decoder.mojom.h"
#include "media/mojo/services/deferred_destroy_unique_receiver_set.h"
#include "media/mojo/services/mojo_cdm_service_context.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "mojo/public/cpp/bindings/unique_receiver_set.h"
namespace media {
class CdmFactory;
class MojoMediaClient;
class Renderer;
class InterfaceFactoryImpl final
: public DeferredDestroy<mojom::InterfaceFactory> {
public:
InterfaceFactoryImpl(
mojo::PendingRemote<mojom::FrameInterfaceFactory> frame_interfaces,
MojoMediaClient* mojo_media_client);
InterfaceFactoryImpl(const InterfaceFactoryImpl&) = delete;
InterfaceFactoryImpl& operator=(const InterfaceFactoryImpl&) = delete;
~InterfaceFactoryImpl() final;
// mojom::InterfaceFactory implementation.
void CreateAudioDecoder(
mojo::PendingReceiver<mojom::AudioDecoder> receiver) final;
void CreateVideoDecoder(
mojo::PendingReceiver<mojom::VideoDecoder> receiver) final;
void CreateDefaultRenderer(
const std::string& audio_device_id,
mojo::PendingReceiver<mojom::Renderer> receiver) final;
#if BUILDFLAG(ENABLE_CAST_RENDERER)
void CreateCastRenderer(
const base::UnguessableToken& overlay_plane_id,
mojo::PendingReceiver<mojom::Renderer> receiver) final;
#endif
#if defined(OS_ANDROID)
void CreateMediaPlayerRenderer(
mojo::PendingRemote<mojom::MediaPlayerRendererClientExtension>
client_extension_remote,
mojo::PendingReceiver<mojom::Renderer> receiver,
mojo::PendingReceiver<mojom::MediaPlayerRendererExtension>
renderer_extension_receiver) final;
void CreateFlingingRenderer(
const std::string& presentation_id,
mojo::PendingRemote<mojom::FlingingRendererClientExtension>
client_extension,
mojo::PendingReceiver<mojom::Renderer> receiver) final;
#endif // defined(OS_ANDROID)
#if defined(OS_WIN)
void CreateMediaFoundationRenderer(
mojo::PendingRemote<mojom::MediaLog> media_log_remote,
mojo::PendingReceiver<mojom::Renderer> receiver,
mojo::PendingReceiver<mojom::MediaFoundationRendererExtension>
renderer_extension_receiver) final;
#endif // defined(OS_WIN)
void CreateCdm(const std::string& key_system,
const CdmConfig& cdm_config,
CreateCdmCallback callback) final;
// DeferredDestroy<mojom::InterfaceFactory> implemenation.
void OnDestroyPending(base::OnceClosure destroy_cb) final;
private:
// Returns true when there is no media component (audio/video decoder,
// renderer, cdm and cdm proxy) receivers exist.
bool IsEmpty();
void SetReceiverDisconnectHandler();
void OnReceiverDisconnect();
#if BUILDFLAG(ENABLE_MOJO_RENDERER) || BUILDFLAG(ENABLE_CAST_RENDERER) || \
defined(OS_WIN)
// Creates MojoRendererService for `renderer`, bind it to `receiver` and add
// them to `renderer_receivers_`.
void AddRenderer(std::unique_ptr<media::Renderer> renderer,
mojo::PendingReceiver<mojom::Renderer> receiver);
#endif
#if BUILDFLAG(ENABLE_MOJO_CDM)
CdmFactory* GetCdmFactory();
void OnCdmServiceInitialized(MojoCdmService* raw_mojo_cdm_service,
CreateCdmCallback callback,
mojom::CdmContextPtr cdm_context,
const std::string& error_message);
#endif // BUILDFLAG(ENABLE_MOJO_CDM)
// Must be declared before the receivers below because the bound objects might
// take a raw pointer of |cdm_service_context_| and assume it's always
// available.
MojoCdmServiceContext cdm_service_context_;
#if BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
mojo::UniqueReceiverSet<mojom::AudioDecoder> audio_decoder_receivers_;
#endif // BUILDFLAG(ENABLE_MOJO_AUDIO_DECODER)
#if BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
mojo::UniqueReceiverSet<mojom::VideoDecoder> video_decoder_receivers_;
#endif // BUILDFLAG(ENABLE_MOJO_VIDEO_DECODER)
#if BUILDFLAG(ENABLE_MOJO_RENDERER) || BUILDFLAG(ENABLE_CAST_RENDERER) || \
defined(OS_WIN)
// TODO(xhwang): Use MojoMediaLog for Renderer.
NullMediaLog media_log_;
mojo::UniqueReceiverSet<mojom::Renderer> renderer_receivers_;
#endif
#if BUILDFLAG(ENABLE_MOJO_CDM)
std::unique_ptr<CdmFactory> cdm_factory_;
mojo::UniqueReceiverSet<mojom::ContentDecryptionModule> cdm_receivers_;
// MojoCdmServices pending initialization.
std::map<MojoCdmService*, std::unique_ptr<MojoCdmService>>
pending_mojo_cdm_services_;
#endif // BUILDFLAG(ENABLE_MOJO_CDM)
mojo::Remote<mojom::FrameInterfaceFactory> frame_interfaces_;
mojo::UniqueReceiverSet<mojom::Decryptor> decryptor_receivers_;
MojoMediaClient* mojo_media_client_;
base::OnceClosure destroy_cb_;
// NOTE: Weak pointers must be invalidated before all other member variables.
base::WeakPtrFactory<InterfaceFactoryImpl> weak_ptr_factory_{this};
};
} // namespace media
#endif // MEDIA_MOJO_SERVICES_INTERFACE_FACTORY_IMPL_H_