OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "webkit/media/crypto/proxy_decryptor.h" | 5 #include "webkit/media/crypto/proxy_decryptor.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
9 #include "base/location.h" | 9 #include "base/location.h" |
10 #include "base/logging.h" | 10 #include "base/logging.h" |
11 #include "base/message_loop_proxy.h" | 11 #include "base/message_loop_proxy.h" |
| 12 #include "media/base/audio_decoder_config.h" |
12 #include "media/base/decoder_buffer.h" | 13 #include "media/base/decoder_buffer.h" |
13 #include "media/base/decryptor_client.h" | 14 #include "media/base/decryptor_client.h" |
14 #include "media/base/video_decoder_config.h" | 15 #include "media/base/video_decoder_config.h" |
15 #include "media/base/video_frame.h" | 16 #include "media/base/video_frame.h" |
16 #include "media/crypto/aes_decryptor.h" | 17 #include "media/crypto/aes_decryptor.h" |
17 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | 18 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
18 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" | 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" |
19 #include "webkit/media/crypto/key_systems.h" | 20 #include "webkit/media/crypto/key_systems.h" |
20 #include "webkit/media/crypto/ppapi_decryptor.h" | 21 #include "webkit/media/crypto/ppapi_decryptor.h" |
21 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 22 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 | 146 |
146 void ProxyDecryptor::CancelKeyRequest(const std::string& key_system, | 147 void ProxyDecryptor::CancelKeyRequest(const std::string& key_system, |
147 const std::string& session_id) { | 148 const std::string& session_id) { |
148 DVLOG(1) << "CancelKeyRequest()"; | 149 DVLOG(1) << "CancelKeyRequest()"; |
149 | 150 |
150 // WebMediaPlayerImpl ensures GenerateKeyRequest() has been called. | 151 // WebMediaPlayerImpl ensures GenerateKeyRequest() has been called. |
151 decryptor_->CancelKeyRequest(key_system, session_id); | 152 decryptor_->CancelKeyRequest(key_system, session_id); |
152 } | 153 } |
153 | 154 |
154 void ProxyDecryptor::Decrypt( | 155 void ProxyDecryptor::Decrypt( |
| 156 StreamType stream_type, |
155 const scoped_refptr<media::DecoderBuffer>& encrypted, | 157 const scoped_refptr<media::DecoderBuffer>& encrypted, |
156 const DecryptCB& decrypt_cb) { | 158 const DecryptCB& decrypt_cb) { |
157 DVLOG(2) << "Decrypt()"; | 159 DVLOG(2) << "Decrypt()"; |
158 DCHECK(decryption_message_loop_->BelongsToCurrentThread()); | 160 DCHECK(decryption_message_loop_->BelongsToCurrentThread()); |
| 161 DCHECK_EQ(stream_type, kVideo); // Only support video decrypt-only for now. |
159 | 162 |
160 DCHECK(!is_canceling_decrypt_); | 163 DCHECK(!is_canceling_decrypt_); |
161 DCHECK(!pending_buffer_to_decrypt_); | 164 DCHECK(!pending_buffer_to_decrypt_); |
162 DCHECK(pending_decrypt_cb_.is_null()); | 165 DCHECK(pending_decrypt_cb_.is_null()); |
163 | 166 |
164 pending_buffer_to_decrypt_ = encrypted; | 167 pending_buffer_to_decrypt_ = encrypted; |
165 pending_decrypt_cb_ = decrypt_cb; | 168 pending_decrypt_cb_ = decrypt_cb; |
166 | 169 |
167 // This is safe as we do not replace/delete an existing decryptor at run-time. | 170 // This is safe as we do not replace/delete an existing decryptor at run-time. |
168 media::Decryptor* decryptor = NULL; | 171 media::Decryptor* decryptor = NULL; |
169 { | 172 { |
170 base::AutoLock auto_lock(lock_); | 173 base::AutoLock auto_lock(lock_); |
171 decryptor = decryptor_.get(); | 174 decryptor = decryptor_.get(); |
172 } | 175 } |
173 if (!decryptor) { | 176 if (!decryptor) { |
174 DVLOG(1) << "Decrypt(): decryptor not initialized."; | 177 DVLOG(1) << "Decrypt(): decryptor not initialized."; |
175 | 178 |
176 // TODO(xhwang): The same NeedKey may be fired here and multiple times in | 179 // TODO(xhwang): The same NeedKey may be fired here and multiple times in |
177 // OnBufferDecrypted(). While the spec says only one NeedKey should be | 180 // OnBufferDecrypted(). While the spec says only one NeedKey should be |
178 // fired. Leave them as is since the spec about this may change. | 181 // fired. Leave them as is since the spec about this may change. |
179 FireNeedKey(client_, encrypted); | 182 FireNeedKey(client_, encrypted); |
180 return; | 183 return; |
181 } | 184 } |
182 | 185 |
183 DecryptPendingBuffer(); | 186 DecryptPendingBuffer(); |
184 } | 187 } |
185 | 188 |
186 void ProxyDecryptor::CancelDecrypt() { | 189 void ProxyDecryptor::CancelDecrypt(StreamType stream_type) { |
187 DVLOG(1) << "CancelDecrypt()"; | 190 DVLOG(1) << "CancelDecrypt()"; |
188 DCHECK(decryption_message_loop_->BelongsToCurrentThread()); | 191 DCHECK(decryption_message_loop_->BelongsToCurrentThread()); |
| 192 DCHECK_EQ(stream_type, kVideo); // Only support video decrypt-only for now. |
189 | 193 |
190 if (!pending_buffer_to_decrypt_) { | 194 if (!pending_buffer_to_decrypt_) { |
191 DCHECK(pending_decrypt_cb_.is_null()); | 195 DCHECK(pending_decrypt_cb_.is_null()); |
192 DCHECK(!is_waiting_for_decryptor_); | 196 DCHECK(!is_waiting_for_decryptor_); |
193 return; | 197 return; |
194 } | 198 } |
195 | 199 |
196 DecryptCB decrypt_cb; | 200 DecryptCB decrypt_cb; |
197 if (!is_waiting_for_decryptor_) { | 201 if (!is_waiting_for_decryptor_) { |
198 pending_buffer_to_decrypt_ = NULL; | 202 pending_buffer_to_decrypt_ = NULL; |
199 base::ResetAndReturn(&pending_decrypt_cb_).Run(kSuccess, NULL); | 203 base::ResetAndReturn(&pending_decrypt_cb_).Run(kSuccess, NULL); |
200 return; | 204 return; |
201 } | 205 } |
202 | 206 |
203 is_canceling_decrypt_ = true; | 207 is_canceling_decrypt_ = true; |
204 decryptor_->CancelDecrypt(); | 208 decryptor_->CancelDecrypt(stream_type); |
| 209 } |
| 210 |
| 211 void ProxyDecryptor::InitializeAudioDecoder( |
| 212 scoped_ptr<media::AudioDecoderConfig> config, |
| 213 const DecoderInitCB& init_cb, |
| 214 const KeyAddedCB& key_added_cb) { |
| 215 NOTREACHED() << "ProxyDecryptor does not support audio decoding"; |
205 } | 216 } |
206 | 217 |
207 void ProxyDecryptor::InitializeVideoDecoder( | 218 void ProxyDecryptor::InitializeVideoDecoder( |
208 scoped_ptr<media::VideoDecoderConfig> config, | 219 scoped_ptr<media::VideoDecoderConfig> config, |
209 const DecoderInitCB& init_cb, | 220 const DecoderInitCB& init_cb, |
210 const KeyAddedCB& key_added_cb) { | 221 const KeyAddedCB& key_added_cb) { |
211 NOTREACHED() << "ProxyDecryptor does not support video decoding"; | 222 NOTREACHED() << "ProxyDecryptor does not support video decoding"; |
212 } | 223 } |
213 | 224 |
| 225 void ProxyDecryptor::DecryptAndDecodeAudio( |
| 226 const scoped_refptr<media::DecoderBuffer>& encrypted, |
| 227 const AudioDecodeCB& audio_decode_cb) { |
| 228 NOTREACHED() << "ProxyDecryptor does not support audio decoding"; |
| 229 } |
| 230 |
214 void ProxyDecryptor::DecryptAndDecodeVideo( | 231 void ProxyDecryptor::DecryptAndDecodeVideo( |
215 const scoped_refptr<media::DecoderBuffer>& encrypted, | 232 const scoped_refptr<media::DecoderBuffer>& encrypted, |
216 const VideoDecodeCB& video_decode_cb) { | 233 const VideoDecodeCB& video_decode_cb) { |
217 NOTREACHED() << "ProxyDecryptor does not support video decoding"; | 234 NOTREACHED() << "ProxyDecryptor does not support video decoding"; |
218 } | 235 } |
219 | 236 |
220 void ProxyDecryptor::CancelDecryptAndDecodeVideo() { | 237 void ProxyDecryptor::ResetDecoder(StreamType stream_type) { |
221 NOTREACHED() << "ProxyDecryptor does not support video decoding"; | 238 NOTREACHED() << "ProxyDecryptor does not support audio/video decoding"; |
222 } | 239 } |
223 | 240 |
224 void ProxyDecryptor::StopVideoDecoder() { | 241 void ProxyDecryptor::DeinitializeDecoder(StreamType stream_type) { |
225 NOTREACHED() << "ProxyDecryptor does not support video decoding"; | 242 NOTREACHED() << "ProxyDecryptor does not support audio/video decoding"; |
226 } | 243 } |
227 | 244 |
228 scoped_ptr<media::Decryptor> ProxyDecryptor::CreatePpapiDecryptor( | 245 scoped_ptr<media::Decryptor> ProxyDecryptor::CreatePpapiDecryptor( |
229 const std::string& key_system) { | 246 const std::string& key_system) { |
230 DCHECK(client_); | 247 DCHECK(client_); |
231 DCHECK(web_media_player_client_); | 248 DCHECK(web_media_player_client_); |
232 DCHECK(web_frame_); | 249 DCHECK(web_frame_); |
233 | 250 |
234 std::string plugin_type = GetPluginType(key_system); | 251 std::string plugin_type = GetPluginType(key_system); |
235 DCHECK(!plugin_type.empty()); | 252 DCHECK(!plugin_type.empty()); |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 } | 300 } |
284 | 301 |
285 void ProxyDecryptor::DecryptPendingBuffer() { | 302 void ProxyDecryptor::DecryptPendingBuffer() { |
286 DVLOG(3) << "DecryptPendingBuffer()"; | 303 DVLOG(3) << "DecryptPendingBuffer()"; |
287 DCHECK(decryption_message_loop_->BelongsToCurrentThread()); | 304 DCHECK(decryption_message_loop_->BelongsToCurrentThread()); |
288 DCHECK(pending_buffer_to_decrypt_); | 305 DCHECK(pending_buffer_to_decrypt_); |
289 DCHECK(!is_waiting_for_decryptor_); | 306 DCHECK(!is_waiting_for_decryptor_); |
290 | 307 |
291 is_waiting_for_decryptor_ = true; | 308 is_waiting_for_decryptor_ = true; |
292 decryptor_->Decrypt( | 309 decryptor_->Decrypt( |
| 310 kVideo, // Only support video decrypt-only for now. |
293 pending_buffer_to_decrypt_, | 311 pending_buffer_to_decrypt_, |
294 base::Bind(&ProxyDecryptor::OnBufferDecrypted, base::Unretained(this))); | 312 base::Bind(&ProxyDecryptor::OnBufferDecrypted, base::Unretained(this))); |
295 } | 313 } |
296 | 314 |
297 void ProxyDecryptor::OnBufferDecrypted( | 315 void ProxyDecryptor::OnBufferDecrypted( |
298 media::Decryptor::Status status, | 316 media::Decryptor::Status status, |
299 const scoped_refptr<media::DecoderBuffer>& decrypted) { | 317 const scoped_refptr<media::DecoderBuffer>& decrypted) { |
300 if (!decryption_message_loop_->BelongsToCurrentThread()) { | 318 if (!decryption_message_loop_->BelongsToCurrentThread()) { |
301 decryption_message_loop_->PostTask(FROM_HERE, base::Bind( | 319 decryption_message_loop_->PostTask(FROM_HERE, base::Bind( |
302 &ProxyDecryptor::OnBufferDecrypted, base::Unretained(this), | 320 &ProxyDecryptor::OnBufferDecrypted, base::Unretained(this), |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 return; | 352 return; |
335 } | 353 } |
336 | 354 |
337 // TODO(xhwang): The same NeedKey may be fired multiple times here and also | 355 // TODO(xhwang): The same NeedKey may be fired multiple times here and also |
338 // in Decrypt(). While the spec says only one NeedKey should be fired. Leave | 356 // in Decrypt(). While the spec says only one NeedKey should be fired. Leave |
339 // them as is since the spec about this may change. | 357 // them as is since the spec about this may change. |
340 FireNeedKey(client_, pending_buffer_to_decrypt_); | 358 FireNeedKey(client_, pending_buffer_to_decrypt_); |
341 } | 359 } |
342 | 360 |
343 } // namespace webkit_media | 361 } // namespace webkit_media |
OLD | NEW |