| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_MOJO_SERVICES_STABLE_VIDEO_DECODER_FACTORY_SERVICE_H_ |
| #define MEDIA_MOJO_SERVICES_STABLE_VIDEO_DECODER_FACTORY_SERVICE_H_ |
| |
| #include "base/functional/callback.h" |
| #include "base/sequence_checker.h" |
| #include "media/mojo/mojom/stable/stable_video_decoder.mojom.h" |
| #include "media/mojo/services/media_mojo_export.h" |
| #include "media/mojo/services/mojo_cdm_service_context.h" |
| #include "mojo/public/cpp/bindings/pending_receiver.h" |
| #include "mojo/public/cpp/bindings/receiver.h" |
| #include "mojo/public/cpp/bindings/unique_receiver_set.h" |
| |
| namespace media { |
| namespace mojom { |
| class VideoDecoder; |
| } // namespace mojom |
| |
| class MojoMediaClient; |
| |
| // A StableVideoDecoderFactoryService allows a browser process to create |
| // StableVideoDecoders. It's intended to live inside a video decoder process (a |
| // utility process) and there should only be one such instance per process |
| // because one video decoder process corresponds to a client that handles one |
| // origin. For example, all the StableVideoDecoders for a video conference call |
| // can live in the same process (and thus be created by the same |
| // StableVideoDecoderFactoryService). However, the StableVideoDecoder for a |
| // YouTube video should live in a process separate than a StableVideoDecoder for |
| // a Vimeo video. |
| class MEDIA_MOJO_EXPORT StableVideoDecoderFactoryService |
| : public stable::mojom::StableVideoDecoderFactory { |
| public: |
| StableVideoDecoderFactoryService(const gpu::GpuFeatureInfo& gpu_feature_info, |
| bool enable_direct_video_decoder); |
| StableVideoDecoderFactoryService(const StableVideoDecoderFactoryService&) = |
| delete; |
| StableVideoDecoderFactoryService& operator=( |
| const StableVideoDecoderFactoryService&) = delete; |
| ~StableVideoDecoderFactoryService() override; |
| |
| using VideoDecoderCreationCBForTesting = |
| base::RepeatingCallback<std::unique_ptr<mojom::VideoDecoder>( |
| MojoMediaClient*, |
| MojoCdmServiceContext*)>; |
| void SetVideoDecoderCreationCallbackForTesting( |
| VideoDecoderCreationCBForTesting video_decoder_creation_cb_for_testing) { |
| DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); |
| video_decoder_creation_cb_for_testing_ = |
| video_decoder_creation_cb_for_testing; |
| } |
| |
| void BindReceiver( |
| mojo::PendingReceiver<stable::mojom::StableVideoDecoderFactory> receiver, |
| base::OnceClosure disconnect_cb); |
| |
| // stable::mojom::StableVideoDecoderFactory implementation. |
| void CreateStableVideoDecoder( |
| mojo::PendingReceiver<stable::mojom::StableVideoDecoder> receiver) |
| override; |
| |
| private: |
| VideoDecoderCreationCBForTesting video_decoder_creation_cb_for_testing_ |
| GUARDED_BY_CONTEXT(sequence_checker_); |
| |
| mojo::Receiver<stable::mojom::StableVideoDecoderFactory> receiver_; |
| |
| // |mojo_media_client_| and |cdm_service_context_| must be declared before |
| // |video_decoders_| because the interface implementation instances managed by |
| // that set take raw pointers to them. |
| std::unique_ptr<MojoMediaClient> mojo_media_client_ |
| GUARDED_BY_CONTEXT(sequence_checker_); |
| MojoCdmServiceContext cdm_service_context_ |
| GUARDED_BY_CONTEXT(sequence_checker_); |
| mojo::UniqueReceiverSet<stable::mojom::StableVideoDecoder> video_decoders_ |
| GUARDED_BY_CONTEXT(sequence_checker_); |
| |
| SEQUENCE_CHECKER(sequence_checker_); |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_MOJO_SERVICES_STABLE_VIDEO_DECODER_FACTORY_SERVICE_H_ |