| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/renderer/media/crypto/proxy_decryptor.h" | 5 #include "webkit/renderer/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/logging.h" | 9 #include "base/logging.h" |
| 10 #include "media/crypto/aes_decryptor.h" | 10 #include "media/crypto/aes_decryptor.h" |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 48 web_media_player_client_->closeHelperPlugin(); | 48 web_media_player_client_->closeHelperPlugin(); |
| 49 } | 49 } |
| 50 | 50 |
| 51 #endif // defined(ENABLE_PEPPER_CDMS) | 51 #endif // defined(ENABLE_PEPPER_CDMS) |
| 52 | 52 |
| 53 ProxyDecryptor::ProxyDecryptor( | 53 ProxyDecryptor::ProxyDecryptor( |
| 54 WebKit::WebMediaPlayerClient* web_media_player_client, | 54 WebKit::WebMediaPlayerClient* web_media_player_client, |
| 55 WebKit::WebFrame* web_frame, | 55 WebKit::WebFrame* web_frame, |
| 56 const media::KeyAddedCB& key_added_cb, | 56 const media::KeyAddedCB& key_added_cb, |
| 57 const media::KeyErrorCB& key_error_cb, | 57 const media::KeyErrorCB& key_error_cb, |
| 58 const media::KeyMessageCB& key_message_cb, | 58 const media::KeyMessageCB& key_message_cb) |
| 59 const media::NeedKeyCB& need_key_cb) | |
| 60 : web_media_player_client_(web_media_player_client), | 59 : web_media_player_client_(web_media_player_client), |
| 61 web_frame_(web_frame), | 60 web_frame_(web_frame), |
| 62 key_added_cb_(key_added_cb), | 61 key_added_cb_(key_added_cb), |
| 63 key_error_cb_(key_error_cb), | 62 key_error_cb_(key_error_cb), |
| 64 key_message_cb_(key_message_cb), | 63 key_message_cb_(key_message_cb), |
| 65 need_key_cb_(need_key_cb), | |
| 66 weak_ptr_factory_(this) { | 64 weak_ptr_factory_(this) { |
| 67 } | 65 } |
| 68 | 66 |
| 69 ProxyDecryptor::~ProxyDecryptor() { | 67 ProxyDecryptor::~ProxyDecryptor() { |
| 70 // Destroy the decryptor explicitly before destroying the plugin. | 68 // Destroy the decryptor explicitly before destroying the plugin. |
| 71 { | 69 { |
| 72 base::AutoLock auto_lock(lock_); | 70 base::AutoLock auto_lock(lock_); |
| 73 media_keys_.reset(); | 71 media_keys_.reset(); |
| 74 } | 72 } |
| 75 } | 73 } |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 156 DVLOG(1) << "ProxyDecryptor: plugin instance creation failed."; | 154 DVLOG(1) << "ProxyDecryptor: plugin instance creation failed."; |
| 157 return scoped_ptr<media::MediaKeys>(); | 155 return scoped_ptr<media::MediaKeys>(); |
| 158 } | 156 } |
| 159 | 157 |
| 160 scoped_ptr<webkit_media::PpapiDecryptor> decryptor = PpapiDecryptor::Create( | 158 scoped_ptr<webkit_media::PpapiDecryptor> decryptor = PpapiDecryptor::Create( |
| 161 key_system, | 159 key_system, |
| 162 plugin_instance, | 160 plugin_instance, |
| 163 base::Bind(&ProxyDecryptor::KeyAdded, weak_ptr_factory_.GetWeakPtr()), | 161 base::Bind(&ProxyDecryptor::KeyAdded, weak_ptr_factory_.GetWeakPtr()), |
| 164 base::Bind(&ProxyDecryptor::KeyError, weak_ptr_factory_.GetWeakPtr()), | 162 base::Bind(&ProxyDecryptor::KeyError, weak_ptr_factory_.GetWeakPtr()), |
| 165 base::Bind(&ProxyDecryptor::KeyMessage, weak_ptr_factory_.GetWeakPtr()), | 163 base::Bind(&ProxyDecryptor::KeyMessage, weak_ptr_factory_.GetWeakPtr()), |
| 166 base::Bind(&ProxyDecryptor::NeedKey, weak_ptr_factory_.GetWeakPtr()), | |
| 167 base::Bind(&ProxyDecryptor::DestroyHelperPlugin, | 164 base::Bind(&ProxyDecryptor::DestroyHelperPlugin, |
| 168 weak_ptr_factory_.GetWeakPtr())); | 165 weak_ptr_factory_.GetWeakPtr())); |
| 169 | 166 |
| 170 if (!decryptor) | 167 if (!decryptor) |
| 171 DestroyHelperPlugin(); | 168 DestroyHelperPlugin(); |
| 172 // Else the new object will call destroy_plugin_cb to destroy Helper Plugin. | 169 // Else the new object will call destroy_plugin_cb to destroy Helper Plugin. |
| 173 | 170 |
| 174 return scoped_ptr<media::MediaKeys>(decryptor.Pass()); | 171 return scoped_ptr<media::MediaKeys>(decryptor.Pass()); |
| 175 } | 172 } |
| 176 #endif // defined(ENABLE_PEPPER_CDMS) | 173 #endif // defined(ENABLE_PEPPER_CDMS) |
| 177 | 174 |
| 178 scoped_ptr<media::MediaKeys> ProxyDecryptor::CreateMediaKeys( | 175 scoped_ptr<media::MediaKeys> ProxyDecryptor::CreateMediaKeys( |
| 179 const std::string& key_system) { | 176 const std::string& key_system) { |
| 180 if (CanUseAesDecryptor(key_system)) { | 177 if (CanUseAesDecryptor(key_system)) { |
| 181 return scoped_ptr<media::MediaKeys>(new media::AesDecryptor( | 178 return scoped_ptr<media::MediaKeys>(new media::AesDecryptor( |
| 182 base::Bind(&ProxyDecryptor::KeyAdded, weak_ptr_factory_.GetWeakPtr()), | 179 base::Bind(&ProxyDecryptor::KeyAdded, weak_ptr_factory_.GetWeakPtr()), |
| 183 base::Bind(&ProxyDecryptor::KeyError, weak_ptr_factory_.GetWeakPtr()), | 180 base::Bind(&ProxyDecryptor::KeyError, weak_ptr_factory_.GetWeakPtr()), |
| 184 base::Bind(&ProxyDecryptor::KeyMessage, weak_ptr_factory_.GetWeakPtr()), | 181 base::Bind(&ProxyDecryptor::KeyMessage, weak_ptr_factory_.GetWeakPtr()) |
| 185 base::Bind(&ProxyDecryptor::NeedKey, weak_ptr_factory_.GetWeakPtr()))); | 182 )); |
| 186 } | 183 } |
| 187 | 184 |
| 188 #if defined(ENABLE_PEPPER_CDMS) | 185 #if defined(ENABLE_PEPPER_CDMS) |
| 189 // We only support AesDecryptor and PpapiDecryptor. So if we cannot | 186 // We only support AesDecryptor and PpapiDecryptor. So if we cannot |
| 190 // use the AesDecryptor, then we'll try to create a PpapiDecryptor for given | 187 // use the AesDecryptor, then we'll try to create a PpapiDecryptor for given |
| 191 // |key_system|. | 188 // |key_system|. |
| 192 return CreatePpapiDecryptor(key_system); | 189 return CreatePpapiDecryptor(key_system); |
| 193 #else | 190 #else |
| 194 return scoped_ptr<media::MediaKeys>(); | 191 return scoped_ptr<media::MediaKeys>(); |
| 195 #endif // defined(ENABLE_PEPPER_CDMS) | 192 #endif // defined(ENABLE_PEPPER_CDMS) |
| 196 } | 193 } |
| 197 | 194 |
| 198 void ProxyDecryptor::KeyAdded(const std::string& session_id) { | 195 void ProxyDecryptor::KeyAdded(const std::string& session_id) { |
| 199 key_added_cb_.Run(session_id); | 196 key_added_cb_.Run(session_id); |
| 200 } | 197 } |
| 201 | 198 |
| 202 void ProxyDecryptor::KeyError(const std::string& session_id, | 199 void ProxyDecryptor::KeyError(const std::string& session_id, |
| 203 media::MediaKeys::KeyError error_code, | 200 media::MediaKeys::KeyError error_code, |
| 204 int system_code) { | 201 int system_code) { |
| 205 key_error_cb_.Run(session_id, error_code, system_code); | 202 key_error_cb_.Run(session_id, error_code, system_code); |
| 206 } | 203 } |
| 207 | 204 |
| 208 void ProxyDecryptor::KeyMessage(const std::string& session_id, | 205 void ProxyDecryptor::KeyMessage(const std::string& session_id, |
| 209 const std::string& message, | 206 const std::string& message, |
| 210 const std::string& default_url) { | 207 const std::string& default_url) { |
| 211 key_message_cb_.Run(session_id, message, default_url); | 208 key_message_cb_.Run(session_id, message, default_url); |
| 212 } | 209 } |
| 213 | 210 |
| 214 void ProxyDecryptor::NeedKey(const std::string& session_id, | |
| 215 const std::string& type, | |
| 216 scoped_ptr<uint8[]> init_data, | |
| 217 int init_data_size) { | |
| 218 need_key_cb_.Run(session_id, type, init_data.Pass(), init_data_size); | |
| 219 } | |
| 220 | |
| 221 } // namespace webkit_media | 211 } // namespace webkit_media |
| OLD | NEW |