blob: 4b2e9f125f30c049c696f325608f9ceea9ce4a40 [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_MOJO_DECRYPTOR_SERVICE_H_
#define MEDIA_MOJO_SERVICES_MOJO_DECRYPTOR_SERVICE_H_
#include <stddef.h>
#include <stdint.h>
#include <unordered_map>
#include "base/callback.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "media/base/decryptor.h"
#include "media/mojo/interfaces/decryptor.mojom.h"
#include "mojo/public/cpp/bindings/binding.h"
namespace media {
class DecoderBuffer;
class ContentDecryptionModule;
class MojoDecoderBufferReader;
class MojoDecoderBufferWriter;
// A mojom::Decryptor implementation. This object is owned by the creator,
// and uses a weak binding across the mojo interface.
class MojoDecryptorService : public mojom::Decryptor {
public:
using StreamType = media::Decryptor::StreamType;
using Status = media::Decryptor::Status;
// Constructs a MojoDecryptorService and binds it to the |request|. Keeps a
// copy of |cdm| to prevent it from being deleted as long as it is needed.
// |error_handler| will be called if a connection error occurs.
MojoDecryptorService(const scoped_refptr<ContentDecryptionModule>& cdm,
mojo::InterfaceRequest<mojom::Decryptor> request,
const base::Closure& error_handler);
~MojoDecryptorService() final;
// mojom::Decryptor implementation.
void Initialize(mojo::ScopedDataPipeConsumerHandle receive_pipe,
mojo::ScopedDataPipeProducerHandle transmit_pipe) final;
void Decrypt(StreamType stream_type,
mojom::DecoderBufferPtr encrypted,
const DecryptCallback& callback) final;
void CancelDecrypt(StreamType stream_type) final;
void InitializeAudioDecoder(
mojom::AudioDecoderConfigPtr config,
const InitializeAudioDecoderCallback& callback) final;
void InitializeVideoDecoder(
mojom::VideoDecoderConfigPtr config,
const InitializeVideoDecoderCallback& callback) final;
void DecryptAndDecodeAudio(
mojom::DecoderBufferPtr encrypted,
const DecryptAndDecodeAudioCallback& callback) final;
void DecryptAndDecodeVideo(
mojom::DecoderBufferPtr encrypted,
const DecryptAndDecodeVideoCallback& callback) final;
void ResetDecoder(StreamType stream_type) final;
void DeinitializeDecoder(StreamType stream_type) final;
void ReleaseSharedBuffer(mojo::ScopedSharedBufferHandle buffer,
uint64_t buffer_size) final;
private:
void OnReadDone(StreamType stream_type,
const DecryptCallback& callback,
scoped_refptr<DecoderBuffer> buffer);
// Callback executed once Decrypt() is done.
void OnDecryptDone(const DecryptCallback& callback,
Status status,
const scoped_refptr<DecoderBuffer>& buffer);
// Callbacks executed once decoder initialized.
void OnAudioDecoderInitialized(const InitializeAudioDecoderCallback& callback,
bool success);
void OnVideoDecoderInitialized(const InitializeVideoDecoderCallback& callback,
bool success);
void OnAudioRead(const DecryptAndDecodeAudioCallback& callback,
scoped_refptr<DecoderBuffer> buffer);
void OnVideoRead(const DecryptAndDecodeVideoCallback& callback,
scoped_refptr<DecoderBuffer> buffer);
// Callbacks executed when DecryptAndDecode are done.
void OnAudioDecoded(const DecryptAndDecodeAudioCallback& callback,
Status status,
const media::Decryptor::AudioFrames& frames);
void OnVideoDecoded(const DecryptAndDecodeVideoCallback& callback,
Status status,
const scoped_refptr<VideoFrame>& frame);
// A weak binding is used to connect to the MojoDecryptor.
mojo::Binding<mojom::Decryptor> binding_;
// Helper class to send decrypted DecoderBuffer to the client.
std::unique_ptr<MojoDecoderBufferWriter> mojo_decoder_buffer_writer_;
// Helper class to receive encrypted DecoderBuffer from the client.
std::unique_ptr<MojoDecoderBufferReader> mojo_decoder_buffer_reader_;
// Keep ownership of |cdm_| while it is being used. |decryptor_| is the actual
// Decryptor referenced by |cdm_|.
scoped_refptr<ContentDecryptionModule> cdm_;
media::Decryptor* decryptor_;
// Keep a reference to VideoFrames until ReleaseSharedBuffer() is called
// to release it.
std::unordered_map<MojoHandle, scoped_refptr<VideoFrame>>
in_use_video_frames_;
base::WeakPtr<MojoDecryptorService> weak_this_;
base::WeakPtrFactory<MojoDecryptorService> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(MojoDecryptorService);
};
} // namespace media
#endif // MEDIA_MOJO_SERVICES_MOJO_DECRYPTOR_SERVICE_H_