Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4072)

Unified Diff: media/mojo/services/mojo_decryptor_service.cc

Issue 1538063003: Use data pipe to pass DecoderBuffer contents (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: changes (+rebase) Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/mojo/services/mojo_decryptor_service.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « media/mojo/services/mojo_decryptor_service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698