| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/mojo/services/mojo_decryptor_service.h" | 5 #include "media/mojo/services/mojo_decryptor_service.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/numerics/safe_conversions.h" | 10 #include "base/numerics/safe_conversions.h" |
| 11 #include "media/base/audio_decoder_config.h" | 11 #include "media/base/audio_decoder_config.h" |
| 12 #include "media/base/cdm_context.h" | 12 #include "media/base/cdm_context.h" |
| 13 #include "media/base/decoder_buffer.h" | 13 #include "media/base/decoder_buffer.h" |
| 14 #include "media/base/decryptor.h" | 14 #include "media/base/decryptor.h" |
| 15 #include "media/base/media_keys.h" | 15 #include "media/base/media_keys.h" |
| 16 #include "media/base/video_decoder_config.h" | 16 #include "media/base/video_decoder_config.h" |
| 17 #include "media/base/video_frame.h" | 17 #include "media/base/video_frame.h" |
| 18 #include "media/mojo/common/media_type_converters.h" | 18 #include "media/mojo/common/media_type_converters.h" |
| 19 #include "media/mojo/common/mojo_shared_buffer_video_frame.h" | 19 #include "media/mojo/common/mojo_shared_buffer_video_frame.h" |
| 20 #include "media/mojo/interfaces/demuxer_stream.mojom.h" | 20 #include "media/mojo/interfaces/demuxer_stream.mojom.h" |
| 21 | 21 |
| 22 namespace media { | 22 namespace media { |
| 23 | 23 |
| 24 MojoDecryptorService::MojoDecryptorService( | 24 MojoDecryptorService::MojoDecryptorService( |
| 25 const scoped_refptr<MediaKeys>& cdm, | 25 const scoped_refptr<MediaKeys>& cdm, |
| 26 mojo::InterfaceRequest<interfaces::Decryptor> request, | 26 mojo::InterfaceRequest<mojom::Decryptor> request, |
| 27 const mojo::Closure& error_handler) | 27 const mojo::Closure& error_handler) |
| 28 : binding_(this, std::move(request)), cdm_(cdm), weak_factory_(this) { | 28 : binding_(this, std::move(request)), cdm_(cdm), weak_factory_(this) { |
| 29 DVLOG(1) << __FUNCTION__; | 29 DVLOG(1) << __FUNCTION__; |
| 30 decryptor_ = cdm->GetCdmContext()->GetDecryptor(); | 30 decryptor_ = cdm->GetCdmContext()->GetDecryptor(); |
| 31 DCHECK(decryptor_); | 31 DCHECK(decryptor_); |
| 32 weak_this_ = weak_factory_.GetWeakPtr(); | 32 weak_this_ = weak_factory_.GetWeakPtr(); |
| 33 binding_.set_connection_error_handler(error_handler); | 33 binding_.set_connection_error_handler(error_handler); |
| 34 } | 34 } |
| 35 | 35 |
| 36 MojoDecryptorService::~MojoDecryptorService() {} | 36 MojoDecryptorService::~MojoDecryptorService() {} |
| 37 | 37 |
| 38 void MojoDecryptorService::Initialize( | 38 void MojoDecryptorService::Initialize( |
| 39 mojo::ScopedDataPipeConsumerHandle receive_pipe, | 39 mojo::ScopedDataPipeConsumerHandle receive_pipe, |
| 40 mojo::ScopedDataPipeProducerHandle transmit_pipe) { | 40 mojo::ScopedDataPipeProducerHandle transmit_pipe) { |
| 41 producer_handle_ = std::move(transmit_pipe); | 41 producer_handle_ = std::move(transmit_pipe); |
| 42 consumer_handle_ = std::move(receive_pipe); | 42 consumer_handle_ = std::move(receive_pipe); |
| 43 } | 43 } |
| 44 | 44 |
| 45 void MojoDecryptorService::Decrypt(interfaces::DemuxerStream::Type stream_type, | 45 void MojoDecryptorService::Decrypt(mojom::DemuxerStream::Type stream_type, |
| 46 interfaces::DecoderBufferPtr encrypted, | 46 mojom::DecoderBufferPtr encrypted, |
| 47 const DecryptCallback& callback) { | 47 const DecryptCallback& callback) { |
| 48 DVLOG(3) << __FUNCTION__; | 48 DVLOG(3) << __FUNCTION__; |
| 49 decryptor_->Decrypt( | 49 decryptor_->Decrypt( |
| 50 static_cast<media::Decryptor::StreamType>(stream_type), | 50 static_cast<media::Decryptor::StreamType>(stream_type), |
| 51 ReadDecoderBuffer(std::move(encrypted)), | 51 ReadDecoderBuffer(std::move(encrypted)), |
| 52 base::Bind(&MojoDecryptorService::OnDecryptDone, weak_this_, callback)); | 52 base::Bind(&MojoDecryptorService::OnDecryptDone, weak_this_, callback)); |
| 53 } | 53 } |
| 54 | 54 |
| 55 void MojoDecryptorService::CancelDecrypt( | 55 void MojoDecryptorService::CancelDecrypt( |
| 56 interfaces::DemuxerStream::Type stream_type) { | 56 mojom::DemuxerStream::Type stream_type) { |
| 57 DVLOG(1) << __FUNCTION__; | 57 DVLOG(1) << __FUNCTION__; |
| 58 decryptor_->CancelDecrypt( | 58 decryptor_->CancelDecrypt( |
| 59 static_cast<media::Decryptor::StreamType>(stream_type)); | 59 static_cast<media::Decryptor::StreamType>(stream_type)); |
| 60 } | 60 } |
| 61 | 61 |
| 62 void MojoDecryptorService::InitializeAudioDecoder( | 62 void MojoDecryptorService::InitializeAudioDecoder( |
| 63 interfaces::AudioDecoderConfigPtr config, | 63 mojom::AudioDecoderConfigPtr config, |
| 64 const InitializeAudioDecoderCallback& callback) { | 64 const InitializeAudioDecoderCallback& callback) { |
| 65 DVLOG(1) << __FUNCTION__; | 65 DVLOG(1) << __FUNCTION__; |
| 66 decryptor_->InitializeAudioDecoder( | 66 decryptor_->InitializeAudioDecoder( |
| 67 config.To<AudioDecoderConfig>(), | 67 config.To<AudioDecoderConfig>(), |
| 68 base::Bind(&MojoDecryptorService::OnAudioDecoderInitialized, weak_this_, | 68 base::Bind(&MojoDecryptorService::OnAudioDecoderInitialized, weak_this_, |
| 69 callback)); | 69 callback)); |
| 70 } | 70 } |
| 71 | 71 |
| 72 void MojoDecryptorService::InitializeVideoDecoder( | 72 void MojoDecryptorService::InitializeVideoDecoder( |
| 73 interfaces::VideoDecoderConfigPtr config, | 73 mojom::VideoDecoderConfigPtr config, |
| 74 const InitializeVideoDecoderCallback& callback) { | 74 const InitializeVideoDecoderCallback& callback) { |
| 75 DVLOG(1) << __FUNCTION__; | 75 DVLOG(1) << __FUNCTION__; |
| 76 decryptor_->InitializeVideoDecoder( | 76 decryptor_->InitializeVideoDecoder( |
| 77 config.To<VideoDecoderConfig>(), | 77 config.To<VideoDecoderConfig>(), |
| 78 base::Bind(&MojoDecryptorService::OnVideoDecoderInitialized, weak_this_, | 78 base::Bind(&MojoDecryptorService::OnVideoDecoderInitialized, weak_this_, |
| 79 callback)); | 79 callback)); |
| 80 } | 80 } |
| 81 | 81 |
| 82 void MojoDecryptorService::DecryptAndDecodeAudio( | 82 void MojoDecryptorService::DecryptAndDecodeAudio( |
| 83 interfaces::DecoderBufferPtr encrypted, | 83 mojom::DecoderBufferPtr encrypted, |
| 84 const DecryptAndDecodeAudioCallback& callback) { | 84 const DecryptAndDecodeAudioCallback& callback) { |
| 85 DVLOG(3) << __FUNCTION__; | 85 DVLOG(3) << __FUNCTION__; |
| 86 decryptor_->DecryptAndDecodeAudio( | 86 decryptor_->DecryptAndDecodeAudio( |
| 87 ReadDecoderBuffer(std::move(encrypted)), | 87 ReadDecoderBuffer(std::move(encrypted)), |
| 88 base::Bind(&MojoDecryptorService::OnAudioDecoded, weak_this_, callback)); | 88 base::Bind(&MojoDecryptorService::OnAudioDecoded, weak_this_, callback)); |
| 89 } | 89 } |
| 90 | 90 |
| 91 void MojoDecryptorService::DecryptAndDecodeVideo( | 91 void MojoDecryptorService::DecryptAndDecodeVideo( |
| 92 interfaces::DecoderBufferPtr encrypted, | 92 mojom::DecoderBufferPtr encrypted, |
| 93 const DecryptAndDecodeVideoCallback& callback) { | 93 const DecryptAndDecodeVideoCallback& callback) { |
| 94 DVLOG(3) << __FUNCTION__; | 94 DVLOG(3) << __FUNCTION__; |
| 95 decryptor_->DecryptAndDecodeVideo( | 95 decryptor_->DecryptAndDecodeVideo( |
| 96 ReadDecoderBuffer(std::move(encrypted)), | 96 ReadDecoderBuffer(std::move(encrypted)), |
| 97 base::Bind(&MojoDecryptorService::OnVideoDecoded, weak_this_, callback)); | 97 base::Bind(&MojoDecryptorService::OnVideoDecoded, weak_this_, callback)); |
| 98 } | 98 } |
| 99 | 99 |
| 100 void MojoDecryptorService::ResetDecoder( | 100 void MojoDecryptorService::ResetDecoder( |
| 101 interfaces::DemuxerStream::Type stream_type) { | 101 mojom::DemuxerStream::Type stream_type) { |
| 102 DVLOG(1) << __FUNCTION__; | 102 DVLOG(1) << __FUNCTION__; |
| 103 decryptor_->ResetDecoder( | 103 decryptor_->ResetDecoder( |
| 104 static_cast<media::Decryptor::StreamType>(stream_type)); | 104 static_cast<media::Decryptor::StreamType>(stream_type)); |
| 105 } | 105 } |
| 106 | 106 |
| 107 void MojoDecryptorService::DeinitializeDecoder( | 107 void MojoDecryptorService::DeinitializeDecoder( |
| 108 interfaces::DemuxerStream::Type stream_type) { | 108 mojom::DemuxerStream::Type stream_type) { |
| 109 DVLOG(1) << __FUNCTION__; | 109 DVLOG(1) << __FUNCTION__; |
| 110 decryptor_->DeinitializeDecoder( | 110 decryptor_->DeinitializeDecoder( |
| 111 static_cast<media::Decryptor::StreamType>(stream_type)); | 111 static_cast<media::Decryptor::StreamType>(stream_type)); |
| 112 } | 112 } |
| 113 | 113 |
| 114 void MojoDecryptorService::ReleaseSharedBuffer( | 114 void MojoDecryptorService::ReleaseSharedBuffer( |
| 115 mojo::ScopedSharedBufferHandle buffer, | 115 mojo::ScopedSharedBufferHandle buffer, |
| 116 uint64_t buffer_size) { | 116 uint64_t buffer_size) { |
| 117 in_use_video_frames_.erase(buffer.get().value()); | 117 in_use_video_frames_.erase(buffer.get().value()); |
| 118 } | 118 } |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 150 } | 150 } |
| 151 | 151 |
| 152 void MojoDecryptorService::OnAudioDecoded( | 152 void MojoDecryptorService::OnAudioDecoded( |
| 153 const DecryptAndDecodeAudioCallback& callback, | 153 const DecryptAndDecodeAudioCallback& callback, |
| 154 media::Decryptor::Status status, | 154 media::Decryptor::Status status, |
| 155 const media::Decryptor::AudioFrames& frames) { | 155 const media::Decryptor::AudioFrames& frames) { |
| 156 DVLOG_IF(1, status != media::Decryptor::kSuccess) << __FUNCTION__ << "(" | 156 DVLOG_IF(1, status != media::Decryptor::kSuccess) << __FUNCTION__ << "(" |
| 157 << status << ")"; | 157 << status << ")"; |
| 158 DVLOG_IF(3, status == media::Decryptor::kSuccess) << __FUNCTION__; | 158 DVLOG_IF(3, status == media::Decryptor::kSuccess) << __FUNCTION__; |
| 159 | 159 |
| 160 mojo::Array<interfaces::AudioBufferPtr> audio_buffers; | 160 mojo::Array<mojom::AudioBufferPtr> audio_buffers; |
| 161 for (const auto& frame : frames) | 161 for (const auto& frame : frames) |
| 162 audio_buffers.push_back(interfaces::AudioBuffer::From(frame)); | 162 audio_buffers.push_back(mojom::AudioBuffer::From(frame)); |
| 163 | 163 |
| 164 callback.Run(static_cast<Decryptor::Status>(status), | 164 callback.Run(static_cast<Decryptor::Status>(status), |
| 165 std::move(audio_buffers)); | 165 std::move(audio_buffers)); |
| 166 } | 166 } |
| 167 | 167 |
| 168 void MojoDecryptorService::OnVideoDecoded( | 168 void MojoDecryptorService::OnVideoDecoded( |
| 169 const DecryptAndDecodeVideoCallback& callback, | 169 const DecryptAndDecodeVideoCallback& callback, |
| 170 media::Decryptor::Status status, | 170 media::Decryptor::Status status, |
| 171 const scoped_refptr<VideoFrame>& frame) { | 171 const scoped_refptr<VideoFrame>& frame) { |
| 172 DVLOG_IF(1, status != media::Decryptor::kSuccess) << __FUNCTION__ << "(" | 172 DVLOG_IF(1, status != media::Decryptor::kSuccess) << __FUNCTION__ << "(" |
| 173 << status << ")"; | 173 << status << ")"; |
| 174 DVLOG_IF(3, status == media::Decryptor::kSuccess) << __FUNCTION__; | 174 DVLOG_IF(3, status == media::Decryptor::kSuccess) << __FUNCTION__; |
| 175 | 175 |
| 176 if (!frame) { | 176 if (!frame) { |
| 177 DCHECK_NE(status, media::Decryptor::kSuccess); | 177 DCHECK_NE(status, media::Decryptor::kSuccess); |
| 178 callback.Run(static_cast<Decryptor::Status>(status), nullptr); | 178 callback.Run(static_cast<Decryptor::Status>(status), nullptr); |
| 179 return; | 179 return; |
| 180 } | 180 } |
| 181 | 181 |
| 182 // If |frame| has shared memory that will be passed back, keep a reference | 182 // If |frame| has shared memory that will be passed back, keep a reference |
| 183 // to it until the other side is done with the memory. | 183 // to it until the other side is done with the memory. |
| 184 if (frame->storage_type() == VideoFrame::STORAGE_MOJO_SHARED_BUFFER) { | 184 if (frame->storage_type() == VideoFrame::STORAGE_MOJO_SHARED_BUFFER) { |
| 185 MojoSharedBufferVideoFrame* mojo_frame = | 185 MojoSharedBufferVideoFrame* mojo_frame = |
| 186 static_cast<MojoSharedBufferVideoFrame*>(frame.get()); | 186 static_cast<MojoSharedBufferVideoFrame*>(frame.get()); |
| 187 in_use_video_frames_.insert( | 187 in_use_video_frames_.insert( |
| 188 std::make_pair(mojo_frame->Handle().value(), frame)); | 188 std::make_pair(mojo_frame->Handle().value(), frame)); |
| 189 } | 189 } |
| 190 | 190 |
| 191 callback.Run(static_cast<Decryptor::Status>(status), | 191 callback.Run(static_cast<Decryptor::Status>(status), |
| 192 interfaces::VideoFrame::From(frame)); | 192 mojom::VideoFrame::From(frame)); |
| 193 } | 193 } |
| 194 | 194 |
| 195 interfaces::DecoderBufferPtr MojoDecryptorService::TransferDecoderBuffer( | 195 mojom::DecoderBufferPtr MojoDecryptorService::TransferDecoderBuffer( |
| 196 const scoped_refptr<DecoderBuffer>& encrypted) { | 196 const scoped_refptr<DecoderBuffer>& encrypted) { |
| 197 interfaces::DecoderBufferPtr buffer = | 197 mojom::DecoderBufferPtr buffer = mojom::DecoderBuffer::From(encrypted); |
| 198 interfaces::DecoderBuffer::From(encrypted); | |
| 199 if (encrypted->end_of_stream()) | 198 if (encrypted->end_of_stream()) |
| 200 return buffer; | 199 return buffer; |
| 201 | 200 |
| 202 // Serialize the data section of the DecoderBuffer into our pipe. | 201 // Serialize the data section of the DecoderBuffer into our pipe. |
| 203 uint32_t bytes_to_write = | 202 uint32_t bytes_to_write = |
| 204 base::checked_cast<uint32_t>(encrypted->data_size()); | 203 base::checked_cast<uint32_t>(encrypted->data_size()); |
| 205 DCHECK_GT(bytes_to_write, 0u); | 204 DCHECK_GT(bytes_to_write, 0u); |
| 206 uint32_t bytes_written = bytes_to_write; | 205 uint32_t bytes_written = bytes_to_write; |
| 207 CHECK_EQ(WriteDataRaw(producer_handle_.get(), encrypted->data(), | 206 CHECK_EQ(WriteDataRaw(producer_handle_.get(), encrypted->data(), |
| 208 &bytes_written, MOJO_READ_DATA_FLAG_ALL_OR_NONE), | 207 &bytes_written, MOJO_READ_DATA_FLAG_ALL_OR_NONE), |
| 209 MOJO_RESULT_OK); | 208 MOJO_RESULT_OK); |
| 210 CHECK_EQ(bytes_to_write, bytes_written); | 209 CHECK_EQ(bytes_to_write, bytes_written); |
| 211 return buffer; | 210 return buffer; |
| 212 } | 211 } |
| 213 | 212 |
| 214 scoped_refptr<DecoderBuffer> MojoDecryptorService::ReadDecoderBuffer( | 213 scoped_refptr<DecoderBuffer> MojoDecryptorService::ReadDecoderBuffer( |
| 215 interfaces::DecoderBufferPtr buffer) { | 214 mojom::DecoderBufferPtr buffer) { |
| 216 scoped_refptr<DecoderBuffer> media_buffer( | 215 scoped_refptr<DecoderBuffer> media_buffer( |
| 217 buffer.To<scoped_refptr<DecoderBuffer>>()); | 216 buffer.To<scoped_refptr<DecoderBuffer>>()); |
| 218 if (media_buffer->end_of_stream()) | 217 if (media_buffer->end_of_stream()) |
| 219 return media_buffer; | 218 return media_buffer; |
| 220 | 219 |
| 221 // Wait for the data to become available in the DataPipe. | 220 // Wait for the data to become available in the DataPipe. |
| 222 MojoHandleSignalsState state; | 221 MojoHandleSignalsState state; |
| 223 CHECK_EQ(MOJO_RESULT_OK, | 222 CHECK_EQ(MOJO_RESULT_OK, |
| 224 MojoWait(consumer_handle_.get().value(), MOJO_HANDLE_SIGNAL_READABLE, | 223 MojoWait(consumer_handle_.get().value(), MOJO_HANDLE_SIGNAL_READABLE, |
| 225 MOJO_DEADLINE_INDEFINITE, &state)); | 224 MOJO_DEADLINE_INDEFINITE, &state)); |
| 226 CHECK_EQ(MOJO_HANDLE_SIGNAL_READABLE, state.satisfied_signals); | 225 CHECK_EQ(MOJO_HANDLE_SIGNAL_READABLE, state.satisfied_signals); |
| 227 | 226 |
| 228 // Read the inner data for the DecoderBuffer from our DataPipe. | 227 // Read the inner data for the DecoderBuffer from our DataPipe. |
| 229 uint32_t bytes_to_read = | 228 uint32_t bytes_to_read = |
| 230 base::checked_cast<uint32_t>(media_buffer->data_size()); | 229 base::checked_cast<uint32_t>(media_buffer->data_size()); |
| 231 DCHECK_GT(bytes_to_read, 0u); | 230 DCHECK_GT(bytes_to_read, 0u); |
| 232 uint32_t bytes_read = bytes_to_read; | 231 uint32_t bytes_read = bytes_to_read; |
| 233 CHECK_EQ(ReadDataRaw(consumer_handle_.get(), media_buffer->writable_data(), | 232 CHECK_EQ(ReadDataRaw(consumer_handle_.get(), media_buffer->writable_data(), |
| 234 &bytes_read, MOJO_READ_DATA_FLAG_ALL_OR_NONE), | 233 &bytes_read, MOJO_READ_DATA_FLAG_ALL_OR_NONE), |
| 235 MOJO_RESULT_OK); | 234 MOJO_RESULT_OK); |
| 236 CHECK_EQ(bytes_to_read, bytes_read); | 235 CHECK_EQ(bytes_to_read, bytes_read); |
| 237 return media_buffer; | 236 return media_buffer; |
| 238 } | 237 } |
| 239 | 238 |
| 240 } // namespace media | 239 } // namespace media |
| OLD | NEW |