| // 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_MOJO_DECRYPTOR_SERVICE_H_ |
| #define MEDIA_MOJO_SERVICES_MOJO_DECRYPTOR_SERVICE_H_ |
| |
| #include <stddef.h> |
| #include <stdint.h> |
| |
| #include "base/callback.h" |
| #include "base/compiler_specific.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "base/memory/weak_ptr.h" |
| #include "media/base/cdm_context.h" |
| #include "media/base/decryptor.h" |
| #include "media/mojo/mojom/decryptor.mojom.h" |
| #include "media/mojo/services/media_mojo_export.h" |
| |
| namespace media { |
| |
| class DecoderBuffer; |
| class MojoDecoderBufferReader; |
| class MojoDecoderBufferWriter; |
| |
| // A mojom::Decryptor implementation that proxies decryptor calls to a |
| // media::Decryptor. |
| class MEDIA_MOJO_EXPORT MojoDecryptorService final : public mojom::Decryptor { |
| public: |
| using StreamType = media::Decryptor::StreamType; |
| using Status = media::Decryptor::Status; |
| |
| // If |cdm_context_ref| is null, caller must ensure that |decryptor| outlives |
| // |this|. Otherwise, |decryptor| is guaranteed to be valid as long as |
| // |cdm_context_ref| is held. |
| MojoDecryptorService(media::Decryptor* decryptor, |
| std::unique_ptr<CdmContextRef> cdm_context_ref); |
| |
| MojoDecryptorService(const MojoDecryptorService&) = delete; |
| MojoDecryptorService& operator=(const MojoDecryptorService&) = delete; |
| |
| ~MojoDecryptorService() final; |
| |
| // mojom::Decryptor implementation. |
| void Initialize(mojo::ScopedDataPipeConsumerHandle audio_pipe, |
| mojo::ScopedDataPipeConsumerHandle video_pipe, |
| mojo::ScopedDataPipeConsumerHandle decrypt_pipe, |
| mojo::ScopedDataPipeProducerHandle decrypted_pipe) final; |
| void Decrypt(StreamType stream_type, |
| mojom::DecoderBufferPtr encrypted, |
| DecryptCallback callback) final; |
| void CancelDecrypt(StreamType stream_type) final; |
| void InitializeAudioDecoder(const AudioDecoderConfig& config, |
| InitializeAudioDecoderCallback callback) final; |
| void InitializeVideoDecoder(const VideoDecoderConfig& config, |
| InitializeVideoDecoderCallback callback) final; |
| void DecryptAndDecodeAudio(mojom::DecoderBufferPtr encrypted, |
| DecryptAndDecodeAudioCallback callback) final; |
| void DecryptAndDecodeVideo(mojom::DecoderBufferPtr encrypted, |
| DecryptAndDecodeVideoCallback callback) final; |
| void ResetDecoder(StreamType stream_type) final; |
| void DeinitializeDecoder(StreamType stream_type) final; |
| |
| private: |
| void OnReadDone(StreamType stream_type, |
| DecryptCallback callback, |
| scoped_refptr<DecoderBuffer> buffer); |
| |
| // Callback executed once Decrypt() is done. |
| void OnDecryptDone(DecryptCallback callback, |
| Status status, |
| scoped_refptr<DecoderBuffer> buffer); |
| |
| // Callbacks executed once decoder initialized. |
| void OnAudioDecoderInitialized(InitializeAudioDecoderCallback callback, |
| bool success); |
| void OnVideoDecoderInitialized(InitializeVideoDecoderCallback callback, |
| bool success); |
| |
| void OnAudioRead(DecryptAndDecodeAudioCallback callback, |
| scoped_refptr<DecoderBuffer> buffer); |
| void OnVideoRead(DecryptAndDecodeVideoCallback callback, |
| scoped_refptr<DecoderBuffer> buffer); |
| void OnReaderFlushDone(StreamType stream_type); |
| |
| // Callbacks executed when DecryptAndDecode are done. |
| void OnAudioDecoded(DecryptAndDecodeAudioCallback callback, |
| Status status, |
| const media::Decryptor::AudioFrames& frames); |
| void OnVideoDecoded(DecryptAndDecodeVideoCallback callback, |
| Status status, |
| scoped_refptr<VideoFrame> frame); |
| |
| // Returns audio/video buffer reader according to the |stream_type|. |
| MojoDecoderBufferReader* GetBufferReader(StreamType stream_type) const; |
| |
| bool has_initialize_been_called_ = false; |
| |
| // Helper classes to receive encrypted DecoderBuffer from the client. |
| std::unique_ptr<MojoDecoderBufferReader> audio_buffer_reader_; |
| std::unique_ptr<MojoDecoderBufferReader> video_buffer_reader_; |
| std::unique_ptr<MojoDecoderBufferReader> decrypt_buffer_reader_; |
| |
| // Helper class to send decrypted DecoderBuffer to the client. |
| std::unique_ptr<MojoDecoderBufferWriter> decrypted_buffer_writer_; |
| |
| media::Decryptor* decryptor_; |
| |
| // Holds the CdmContextRef to keep the CdmContext alive for the lifetime of |
| // the |decryptor_|. |
| std::unique_ptr<CdmContextRef> cdm_context_ref_; |
| |
| base::WeakPtr<MojoDecryptorService> weak_this_; |
| base::WeakPtrFactory<MojoDecryptorService> weak_factory_{this}; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_MOJO_SERVICES_MOJO_DECRYPTOR_SERVICE_H_ |