blob: 885e8cc249b893d8f7459246461d9f8f437ba08a [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_CLIENTS_MOJO_DECRYPTOR_H_
#define MEDIA_MOJO_CLIENTS_MOJO_DECRYPTOR_H_
#include <memory>
#include <vector>
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread_checker.h"
#include "media/base/decryptor.h"
#include "media/mojo/mojom/decryptor.mojom.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/remote.h"
namespace media {
class MojoDecoderBufferReader;
class MojoDecoderBufferWriter;
// A Decryptor implementation based on mojo::PendingRemote<mojom::Decryptor>.
// This class is single threaded. The |remote_decryptor| is connected before
// being passed to MojoDecryptor, but it is bound to the thread MojoDecryptor
// lives on the first time it is used in this class.
class MojoDecryptor final : public Decryptor {
public:
// |writer_capacity| can be used for testing. If 0, default writer capacity
// will be used.
MojoDecryptor(mojo::PendingRemote<mojom::Decryptor> remote_decryptor,
uint32_t writer_capacity = 0);
MojoDecryptor(const MojoDecryptor&) = delete;
MojoDecryptor& operator=(const MojoDecryptor&) = delete;
~MojoDecryptor() final;
// Decryptor implementation.
void Decrypt(StreamType stream_type,
scoped_refptr<DecoderBuffer> encrypted,
DecryptCB decrypt_cb) final;
void CancelDecrypt(StreamType stream_type) final;
void InitializeAudioDecoder(const AudioDecoderConfig& config,
DecoderInitCB init_cb) final;
void InitializeVideoDecoder(const VideoDecoderConfig& config,
DecoderInitCB init_cb) final;
void DecryptAndDecodeAudio(scoped_refptr<DecoderBuffer> encrypted,
AudioDecodeCB audio_decode_cb) final;
void DecryptAndDecodeVideo(scoped_refptr<DecoderBuffer> encrypted,
VideoDecodeCB video_decode_cb) final;
void ResetDecoder(StreamType stream_type) final;
void DeinitializeDecoder(StreamType stream_type) final;
private:
// Called when a buffer is decrypted.
void OnBufferDecrypted(DecryptCB decrypt_cb,
Status status,
mojom::DecoderBufferPtr buffer);
void OnBufferRead(DecryptCB decrypt_cb,
Status status,
scoped_refptr<DecoderBuffer> buffer);
void OnAudioDecoded(AudioDecodeCB audio_decode_cb,
Status status,
std::vector<mojom::AudioBufferPtr> audio_buffers);
void OnVideoDecoded(
VideoDecodeCB video_decode_cb,
Status status,
const scoped_refptr<VideoFrame>& video_frame,
mojo::PendingRemote<mojom::FrameResourceReleaser> releaser);
void OnConnectionError(uint32_t custom_reason,
const std::string& description);
// Helper class to get the correct MojoDecoderBufferWriter;
MojoDecoderBufferWriter* GetWriter(StreamType stream_type);
base::ThreadChecker thread_checker_;
mojo::Remote<mojom::Decryptor> remote_decryptor_;
// Helper class to send DecoderBuffer to the |remote_decryptor_| for
// DecryptAndDecodeAudio(), DecryptAndDecodeVideo() and Decrypt().
std::unique_ptr<MojoDecoderBufferWriter> audio_buffer_writer_;
std::unique_ptr<MojoDecoderBufferWriter> video_buffer_writer_;
std::unique_ptr<MojoDecoderBufferWriter> decrypt_buffer_writer_;
// Helper class to receive decrypted DecoderBuffer from the
// |remote_decryptor_|, shared by audio and video.
std::unique_ptr<MojoDecoderBufferReader> decrypted_buffer_reader_;
base::WeakPtrFactory<MojoDecryptor> weak_factory_{this};
};
} // namespace media
#endif // MEDIA_MOJO_CLIENTS_MOJO_DECRYPTOR_H_