| Index: media/mojo/services/mojo_decryptor_service.cc
|
| diff --git a/media/mojo/services/mojo_decryptor_service.cc b/media/mojo/services/mojo_decryptor_service.cc
|
| index 774684a044ed4d38c72619c4f9a6d4ddc2a133a2..8eee96f5d19d31ff328e9f8dbdcf5ce74fdce38b 100644
|
| --- a/media/mojo/services/mojo_decryptor_service.cc
|
| +++ b/media/mojo/services/mojo_decryptor_service.cc
|
| @@ -4,6 +4,8 @@
|
|
|
| #include "media/mojo/services/mojo_decryptor_service.h"
|
|
|
| +#include <utility>
|
| +
|
| #include "base/bind.h"
|
| #include "media/base/audio_decoder_config.h"
|
| #include "media/base/cdm_context.h"
|
| @@ -11,6 +13,7 @@
|
| #include "media/base/decryptor.h"
|
| #include "media/base/media_keys.h"
|
| #include "media/base/video_decoder_config.h"
|
| +#include "media/base/video_frame.h"
|
| #include "media/mojo/interfaces/demuxer_stream.mojom.h"
|
| #include "media/mojo/services/media_type_converters.h"
|
|
|
| @@ -29,17 +32,26 @@ MojoDecryptorService::MojoDecryptorService(
|
|
|
| MojoDecryptorService::~MojoDecryptorService() {}
|
|
|
| +void MojoDecryptorService::Initialize(
|
| + mojo::ScopedDataPipeConsumerHandle receive_pipe,
|
| + mojo::ScopedDataPipeProducerHandle transmit_pipe) {
|
| + producer_handle_ = std::move(transmit_pipe);
|
| + consumer_handle_ = std::move(receive_pipe);
|
| +}
|
| +
|
| void MojoDecryptorService::Decrypt(interfaces::DemuxerStream::Type stream_type,
|
| interfaces::DecoderBufferPtr encrypted,
|
| const DecryptCallback& callback) {
|
| + DVLOG(3) << __FUNCTION__;
|
| decryptor_->Decrypt(
|
| static_cast<media::Decryptor::StreamType>(stream_type),
|
| - encrypted.To<scoped_refptr<DecoderBuffer>>(),
|
| + ReadDecoderBuffer(std::move(encrypted)),
|
| base::Bind(&MojoDecryptorService::OnDecryptDone, weak_this_, callback));
|
| }
|
|
|
| void MojoDecryptorService::CancelDecrypt(
|
| interfaces::DemuxerStream::Type stream_type) {
|
| + DVLOG(1) << __FUNCTION__;
|
| decryptor_->CancelDecrypt(
|
| static_cast<media::Decryptor::StreamType>(stream_type));
|
| }
|
| @@ -47,6 +59,7 @@ void MojoDecryptorService::CancelDecrypt(
|
| void MojoDecryptorService::InitializeAudioDecoder(
|
| interfaces::AudioDecoderConfigPtr config,
|
| const InitializeAudioDecoderCallback& callback) {
|
| + DVLOG(1) << __FUNCTION__;
|
| decryptor_->InitializeAudioDecoder(
|
| config.To<AudioDecoderConfig>(),
|
| base::Bind(&MojoDecryptorService::OnAudioDecoderInitialized, weak_this_,
|
| @@ -56,6 +69,7 @@ void MojoDecryptorService::InitializeAudioDecoder(
|
| void MojoDecryptorService::InitializeVideoDecoder(
|
| interfaces::VideoDecoderConfigPtr config,
|
| const InitializeVideoDecoderCallback& callback) {
|
| + DVLOG(1) << __FUNCTION__;
|
| decryptor_->InitializeVideoDecoder(
|
| config.To<VideoDecoderConfig>(),
|
| base::Bind(&MojoDecryptorService::OnVideoDecoderInitialized, weak_this_,
|
| @@ -65,27 +79,31 @@ void MojoDecryptorService::InitializeVideoDecoder(
|
| void MojoDecryptorService::DecryptAndDecodeAudio(
|
| interfaces::DecoderBufferPtr encrypted,
|
| const DecryptAndDecodeAudioCallback& callback) {
|
| + DVLOG(3) << __FUNCTION__;
|
| decryptor_->DecryptAndDecodeAudio(
|
| - encrypted.To<scoped_refptr<DecoderBuffer>>(),
|
| + ReadDecoderBuffer(std::move(encrypted)),
|
| base::Bind(&MojoDecryptorService::OnAudioDecoded, weak_this_, callback));
|
| }
|
|
|
| void MojoDecryptorService::DecryptAndDecodeVideo(
|
| interfaces::DecoderBufferPtr encrypted,
|
| const DecryptAndDecodeVideoCallback& callback) {
|
| + DVLOG(3) << __FUNCTION__;
|
| decryptor_->DecryptAndDecodeVideo(
|
| - encrypted.To<scoped_refptr<DecoderBuffer>>(),
|
| + ReadDecoderBuffer(std::move(encrypted)),
|
| base::Bind(&MojoDecryptorService::OnVideoDecoded, weak_this_, callback));
|
| }
|
|
|
| void MojoDecryptorService::ResetDecoder(
|
| interfaces::DemuxerStream::Type stream_type) {
|
| + DVLOG(1) << __FUNCTION__;
|
| decryptor_->ResetDecoder(
|
| static_cast<media::Decryptor::StreamType>(stream_type));
|
| }
|
|
|
| void MojoDecryptorService::DeinitializeDecoder(
|
| interfaces::DemuxerStream::Type stream_type) {
|
| + DVLOG(1) << __FUNCTION__;
|
| decryptor_->DeinitializeDecoder(
|
| static_cast<media::Decryptor::StreamType>(stream_type));
|
| }
|
| @@ -94,9 +112,16 @@ void MojoDecryptorService::OnDecryptDone(
|
| const DecryptCallback& callback,
|
| media::Decryptor::Status status,
|
| const scoped_refptr<DecoderBuffer>& buffer) {
|
| - DVLOG(1) << __FUNCTION__ << "(" << status << ")";
|
| + DVLOG(status != media::Decryptor::kSuccess ? 1 : 3) << __FUNCTION__ << "("
|
| + << status << ")";
|
| + if (!buffer) {
|
| + DCHECK_NE(status, media::Decryptor::kSuccess);
|
| + callback.Run(static_cast<Decryptor::Status>(status), nullptr);
|
| + return;
|
| + }
|
| +
|
| callback.Run(static_cast<Decryptor::Status>(status),
|
| - interfaces::DecoderBuffer::From(buffer));
|
| + TransferDecoderBuffer(buffer));
|
| }
|
|
|
| void MojoDecryptorService::OnAudioDecoderInitialized(
|
| @@ -117,8 +142,8 @@ void MojoDecryptorService::OnAudioDecoded(
|
| const DecryptAndDecodeAudioCallback& callback,
|
| media::Decryptor::Status status,
|
| const media::Decryptor::AudioFrames& frames) {
|
| - DVLOG(1) << __FUNCTION__ << "(" << status << ")";
|
| -
|
| + DVLOG(status != media::Decryptor::kSuccess ? 1 : 3) << __FUNCTION__ << "("
|
| + << status << ")";
|
| mojo::Array<interfaces::AudioBufferPtr> audio_buffers;
|
| for (const auto& frame : frames)
|
| audio_buffers.push_back(interfaces::AudioBuffer::From(frame).Pass());
|
| @@ -130,10 +155,50 @@ void MojoDecryptorService::OnVideoDecoded(
|
| const DecryptAndDecodeVideoCallback& callback,
|
| media::Decryptor::Status status,
|
| const scoped_refptr<VideoFrame>& frame) {
|
| - DVLOG(1) << __FUNCTION__ << "(" << status << ")";
|
| + DVLOG(status != media::Decryptor::kSuccess ? 1 : 3) << __FUNCTION__ << "("
|
| + << status << ")";
|
| + if (!frame) {
|
| + DCHECK_NE(status, media::Decryptor::kSuccess);
|
| + callback.Run(static_cast<Decryptor::Status>(status), nullptr);
|
| + return;
|
| + }
|
|
|
| callback.Run(static_cast<Decryptor::Status>(status),
|
| interfaces::VideoFrame::From(frame).Pass());
|
| }
|
|
|
| +interfaces::DecoderBufferPtr MojoDecryptorService::TransferDecoderBuffer(
|
| + const scoped_refptr<DecoderBuffer>& encrypted) {
|
| + interfaces::DecoderBufferPtr buffer =
|
| + interfaces::DecoderBuffer::From(encrypted);
|
| + if (encrypted->end_of_stream())
|
| + return buffer;
|
| +
|
| + // Serialize the data section of the DecoderBuffer into our pipe.
|
| + uint32_t num_bytes = encrypted->data_size();
|
| + DCHECK_GT(num_bytes, 0u);
|
| + CHECK_EQ(WriteDataRaw(producer_handle_.get(), encrypted->data(), &num_bytes,
|
| + MOJO_READ_DATA_FLAG_ALL_OR_NONE),
|
| + MOJO_RESULT_OK);
|
| + CHECK_EQ(num_bytes, static_cast<uint32_t>(encrypted->data_size()));
|
| + return buffer;
|
| +}
|
| +
|
| +scoped_refptr<DecoderBuffer> MojoDecryptorService::ReadDecoderBuffer(
|
| + interfaces::DecoderBufferPtr buffer) {
|
| + scoped_refptr<DecoderBuffer> media_buffer(
|
| + buffer.To<scoped_refptr<DecoderBuffer>>());
|
| + if (media_buffer->end_of_stream())
|
| + return media_buffer;
|
| +
|
| + // Read the inner data for the DecoderBuffer from our DataPipe.
|
| + uint32_t num_bytes = media_buffer->data_size();
|
| + DCHECK_GT(num_bytes, 0u);
|
| + CHECK_EQ(ReadDataRaw(consumer_handle_.get(), media_buffer->writable_data(),
|
| + &num_bytes, MOJO_READ_DATA_FLAG_ALL_OR_NONE),
|
| + MOJO_RESULT_OK);
|
| + CHECK_EQ(num_bytes, static_cast<uint32_t>(media_buffer->data_size()));
|
| + return media_buffer;
|
| +}
|
| +
|
| } // namespace media
|
|
|