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 <stdint.h> | |
8 | |
9 #include <utility> | 7 #include <utility> |
10 | 8 |
11 #include "base/bind.h" | 9 #include "base/bind.h" |
12 #include "base/numerics/safe_conversions.h" | 10 #include "base/numerics/safe_conversions.h" |
13 #include "media/base/audio_decoder_config.h" | 11 #include "media/base/audio_decoder_config.h" |
14 #include "media/base/cdm_context.h" | 12 #include "media/base/cdm_context.h" |
15 #include "media/base/decoder_buffer.h" | 13 #include "media/base/decoder_buffer.h" |
16 #include "media/base/decryptor.h" | 14 #include "media/base/decryptor.h" |
17 #include "media/base/media_keys.h" | 15 #include "media/base/media_keys.h" |
18 #include "media/base/video_decoder_config.h" | 16 #include "media/base/video_decoder_config.h" |
19 #include "media/base/video_frame.h" | 17 #include "media/base/video_frame.h" |
20 #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" |
21 #include "media/mojo/interfaces/demuxer_stream.mojom.h" | 20 #include "media/mojo/interfaces/demuxer_stream.mojom.h" |
22 | 21 |
23 namespace media { | 22 namespace media { |
24 | 23 |
25 MojoDecryptorService::MojoDecryptorService( | 24 MojoDecryptorService::MojoDecryptorService( |
26 const scoped_refptr<MediaKeys>& cdm, | 25 const scoped_refptr<MediaKeys>& cdm, |
27 mojo::InterfaceRequest<interfaces::Decryptor> request, | 26 mojo::InterfaceRequest<interfaces::Decryptor> request, |
28 const mojo::Closure& error_handler) | 27 const mojo::Closure& error_handler) |
29 : binding_(this, std::move(request)), cdm_(cdm), weak_factory_(this) { | 28 : binding_(this, std::move(request)), cdm_(cdm), weak_factory_(this) { |
30 DVLOG(1) << __FUNCTION__; | 29 DVLOG(1) << __FUNCTION__; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 static_cast<media::Decryptor::StreamType>(stream_type)); | 104 static_cast<media::Decryptor::StreamType>(stream_type)); |
106 } | 105 } |
107 | 106 |
108 void MojoDecryptorService::DeinitializeDecoder( | 107 void MojoDecryptorService::DeinitializeDecoder( |
109 interfaces::DemuxerStream::Type stream_type) { | 108 interfaces::DemuxerStream::Type stream_type) { |
110 DVLOG(1) << __FUNCTION__; | 109 DVLOG(1) << __FUNCTION__; |
111 decryptor_->DeinitializeDecoder( | 110 decryptor_->DeinitializeDecoder( |
112 static_cast<media::Decryptor::StreamType>(stream_type)); | 111 static_cast<media::Decryptor::StreamType>(stream_type)); |
113 } | 112 } |
114 | 113 |
| 114 void MojoDecryptorService::ReleaseSharedBuffer( |
| 115 mojo::ScopedSharedBufferHandle buffer, |
| 116 uint64_t buffer_size) { |
| 117 in_use_video_frames_.erase(buffer.get().value()); |
| 118 } |
| 119 |
115 void MojoDecryptorService::OnDecryptDone( | 120 void MojoDecryptorService::OnDecryptDone( |
116 const DecryptCallback& callback, | 121 const DecryptCallback& callback, |
117 media::Decryptor::Status status, | 122 media::Decryptor::Status status, |
118 const scoped_refptr<DecoderBuffer>& buffer) { | 123 const scoped_refptr<DecoderBuffer>& buffer) { |
119 DVLOG_IF(1, status != media::Decryptor::kSuccess) << __FUNCTION__ << "(" | 124 DVLOG_IF(1, status != media::Decryptor::kSuccess) << __FUNCTION__ << "(" |
120 << status << ")"; | 125 << status << ")"; |
121 DVLOG_IF(3, status == media::Decryptor::kSuccess) << __FUNCTION__; | 126 DVLOG_IF(3, status == media::Decryptor::kSuccess) << __FUNCTION__; |
122 | 127 |
123 if (!buffer) { | 128 if (!buffer) { |
124 DCHECK_NE(status, media::Decryptor::kSuccess); | 129 DCHECK_NE(status, media::Decryptor::kSuccess); |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
167 DVLOG_IF(1, status != media::Decryptor::kSuccess) << __FUNCTION__ << "(" | 172 DVLOG_IF(1, status != media::Decryptor::kSuccess) << __FUNCTION__ << "(" |
168 << status << ")"; | 173 << status << ")"; |
169 DVLOG_IF(3, status == media::Decryptor::kSuccess) << __FUNCTION__; | 174 DVLOG_IF(3, status == media::Decryptor::kSuccess) << __FUNCTION__; |
170 | 175 |
171 if (!frame) { | 176 if (!frame) { |
172 DCHECK_NE(status, media::Decryptor::kSuccess); | 177 DCHECK_NE(status, media::Decryptor::kSuccess); |
173 callback.Run(static_cast<Decryptor::Status>(status), nullptr); | 178 callback.Run(static_cast<Decryptor::Status>(status), nullptr); |
174 return; | 179 return; |
175 } | 180 } |
176 | 181 |
| 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. |
| 184 if (frame->storage_type() == VideoFrame::STORAGE_MOJO_SHARED_BUFFER) { |
| 185 MojoSharedBufferVideoFrame* mojo_frame = |
| 186 static_cast<MojoSharedBufferVideoFrame*>(frame.get()); |
| 187 in_use_video_frames_.insert( |
| 188 std::make_pair(mojo_frame->Handle().value(), frame)); |
| 189 } |
| 190 |
177 callback.Run(static_cast<Decryptor::Status>(status), | 191 callback.Run(static_cast<Decryptor::Status>(status), |
178 interfaces::VideoFrame::From(frame)); | 192 interfaces::VideoFrame::From(frame)); |
179 } | 193 } |
180 | 194 |
181 interfaces::DecoderBufferPtr MojoDecryptorService::TransferDecoderBuffer( | 195 interfaces::DecoderBufferPtr MojoDecryptorService::TransferDecoderBuffer( |
182 const scoped_refptr<DecoderBuffer>& encrypted) { | 196 const scoped_refptr<DecoderBuffer>& encrypted) { |
183 interfaces::DecoderBufferPtr buffer = | 197 interfaces::DecoderBufferPtr buffer = |
184 interfaces::DecoderBuffer::From(encrypted); | 198 interfaces::DecoderBuffer::From(encrypted); |
185 if (encrypted->end_of_stream()) | 199 if (encrypted->end_of_stream()) |
186 return buffer; | 200 return buffer; |
(...skipping 30 matching lines...) Expand all Loading... |
217 DCHECK_GT(bytes_to_read, 0u); | 231 DCHECK_GT(bytes_to_read, 0u); |
218 uint32_t bytes_read = bytes_to_read; | 232 uint32_t bytes_read = bytes_to_read; |
219 CHECK_EQ(ReadDataRaw(consumer_handle_.get(), media_buffer->writable_data(), | 233 CHECK_EQ(ReadDataRaw(consumer_handle_.get(), media_buffer->writable_data(), |
220 &bytes_read, MOJO_READ_DATA_FLAG_ALL_OR_NONE), | 234 &bytes_read, MOJO_READ_DATA_FLAG_ALL_OR_NONE), |
221 MOJO_RESULT_OK); | 235 MOJO_RESULT_OK); |
222 CHECK_EQ(bytes_to_read, bytes_read); | 236 CHECK_EQ(bytes_to_read, bytes_read); |
223 return media_buffer; | 237 return media_buffer; |
224 } | 238 } |
225 | 239 |
226 } // namespace media | 240 } // namespace media |
OLD | NEW |