Chromium Code Reviews| 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/logging.h" | 7 #include "base/logging.h" |
| 8 #include "media/base/decoder_buffer.h" | 8 #include "media/base/decoder_buffer.h" |
| 9 #include "media/base/decryptor_client.h" | 9 #include "media/base/decryptor_client.h" |
| 10 #include "media/crypto/aes_decryptor.h" | 10 #include "media/crypto/aes_decryptor.h" |
| 11 #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" | |
| 12 #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient. h" | |
| 13 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" | |
| 11 #include "webkit/media/crypto/key_systems.h" | 14 #include "webkit/media/crypto/key_systems.h" |
| 15 #include "webkit/media/crypto/ppapi_decryptor.h" | |
| 16 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" | |
| 17 #include "webkit/plugins/ppapi/ppapi_webplugin_impl.h" | |
| 12 | 18 |
| 13 namespace webkit_media { | 19 namespace webkit_media { |
| 14 | 20 |
| 15 ProxyDecryptor::ProxyDecryptor(media::DecryptorClient* client) | 21 static scoped_refptr<webkit::ppapi::PluginInstance> CreatePluginInstance( |
| 16 : client_(client) { | 22 const std::string& plugin_type, |
| 23 WebKit::WebMediaPlayerClient* web_media_player_client, | |
| 24 WebKit::WebFrame* web_frame) { | |
| 25 DCHECK(web_media_player_client); | |
| 26 DCHECK(web_frame); | |
| 27 | |
| 28 WebKit::WebPlugin* web_plugin = web_media_player_client->createHelperPlugin( | |
| 29 WebKit::WebString::fromUTF8(plugin_type), web_frame); | |
| 30 if (!web_plugin) | |
| 31 return NULL; | |
| 32 | |
| 33 DCHECK(!web_plugin->isPlaceholder()); // Prevented by WebKit. | |
| 34 // Only Pepper plugins are supported, so it must be a ppapi object. | |
| 35 webkit::ppapi::WebPluginImpl* ppapi_plugin = | |
| 36 static_cast<webkit::ppapi::WebPluginImpl*>(web_plugin); | |
| 37 return ppapi_plugin->instance(); | |
| 38 } | |
| 39 | |
| 40 ProxyDecryptor::ProxyDecryptor( | |
| 41 media::DecryptorClient* decryptor_client, | |
| 42 WebKit::WebMediaPlayerClient* web_media_player_client, | |
| 43 WebKit::WebFrame* web_frame) | |
| 44 : client_(decryptor_client), | |
| 45 web_media_player_client_(web_media_player_client), | |
| 46 web_frame_(web_frame) { | |
| 17 } | 47 } |
| 18 | 48 |
| 19 ProxyDecryptor::~ProxyDecryptor() { | 49 ProxyDecryptor::~ProxyDecryptor() { |
| 20 } | 50 } |
| 21 | 51 |
| 22 void ProxyDecryptor::GenerateKeyRequest(const std::string& key_system, | 52 void ProxyDecryptor::GenerateKeyRequest(const std::string& key_system, |
| 23 const uint8* init_data, | 53 const uint8* init_data, |
| 24 int init_data_length) { | 54 int init_data_length) { |
| 25 // We do not support run-time switching of decryptors. GenerateKeyRequest() | 55 // We do not support run-time switching of decryptors. GenerateKeyRequest() |
| 26 // only creates a new decryptor when |decryptor_| is not initialized. | 56 // only creates a new decryptor when |decryptor_| is not initialized. |
| 27 if (!decryptor_.get()) { | 57 if (!decryptor_.get()) { |
| 28 base::AutoLock auto_lock(lock_); | 58 base::AutoLock auto_lock(lock_); |
| 29 decryptor_ = CreateDecryptor(key_system, client_); | 59 decryptor_ = CreateDecryptor(key_system); |
| 30 } | 60 } |
| 31 | 61 |
| 32 DCHECK(decryptor_.get()); | 62 DCHECK(client_); |
| 63 if (!decryptor_.get()) { | |
| 64 // TODO(ddorwin): Update the spec about generateKeyRequest to include an | |
| 65 // error for handler loading failure. In our case, this can happen when the | |
| 66 // plugin cannot be loaded. | |
| 67 client_->KeyError(key_system, "", Decryptor::kUnknownError, 0); | |
| 68 return; | |
| 69 } | |
| 70 | |
| 33 decryptor_->GenerateKeyRequest(key_system, init_data, init_data_length); | 71 decryptor_->GenerateKeyRequest(key_system, init_data, init_data_length); |
| 34 } | 72 } |
| 35 | 73 |
| 36 void ProxyDecryptor::AddKey(const std::string& key_system, | 74 void ProxyDecryptor::AddKey(const std::string& key_system, |
| 37 const uint8* key, | 75 const uint8* key, |
| 38 int key_length, | 76 int key_length, |
| 39 const uint8* init_data, | 77 const uint8* init_data, |
| 40 int init_data_length, | 78 int init_data_length, |
| 41 const std::string& session_id) { | 79 const std::string& session_id) { |
| 42 // WebMediaPlayerImpl ensures GenerateKeyRequest() has been called. | 80 // WebMediaPlayerImpl ensures GenerateKeyRequest() has been called. |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 60 { | 98 { |
| 61 base::AutoLock auto_lock(lock_); | 99 base::AutoLock auto_lock(lock_); |
| 62 decryptor = decryptor_.get(); | 100 decryptor = decryptor_.get(); |
| 63 } | 101 } |
| 64 if (!decryptor) | 102 if (!decryptor) |
| 65 decrypt_cb.Run(kError, NULL); | 103 decrypt_cb.Run(kError, NULL); |
| 66 | 104 |
| 67 return decryptor->Decrypt(encrypted, decrypt_cb); | 105 return decryptor->Decrypt(encrypted, decrypt_cb); |
| 68 } | 106 } |
| 69 | 107 |
| 108 scoped_ptr<media::Decryptor> ProxyDecryptor::CreatePpapiDecryptor( | |
| 109 const std::string& key_system) { | |
| 110 DCHECK(client_); | |
| 111 DCHECK(web_media_player_client_); | |
| 112 DCHECK(web_frame_); | |
| 113 | |
| 114 std::string plugin_type = GetPluginType(key_system); | |
| 115 DCHECK(!plugin_type.empty()); | |
| 116 const scoped_refptr<webkit::ppapi::PluginInstance>& plugin_instance = | |
| 117 CreatePluginInstance(plugin_type, web_media_player_client_, web_frame_); | |
| 118 if (!plugin_instance) { | |
| 119 DVLOG(1) << "PpapiDecryptor: plugin instance creation failed."; | |
| 120 return scoped_ptr<media::Decryptor>(); | |
| 121 } | |
| 122 | |
| 123 return scoped_ptr<Decryptor>(new PpapiDecryptor(client_, plugin_instance)); | |
|
ddorwin
2012/07/19 20:50:09
media:: appears with Decryptor in most places but
xhwang
2012/07/19 21:54:03
Since ProxyDecryptor inherits media::Decryptor, so
| |
| 124 } | |
| 125 | |
| 126 scoped_ptr<media::Decryptor> ProxyDecryptor::CreateDecryptor( | |
| 127 const std::string& key_system) { | |
| 128 DCHECK(client_); | |
| 129 | |
| 130 if (CanUseAesDecryptor(key_system)) | |
| 131 return scoped_ptr<media::Decryptor>(new media::AesDecryptor(client_)); | |
| 132 | |
| 133 // We only support AesDecryptor and PpapiDecryptor. So if we cannot | |
| 134 // use the AesDecryptor, then we'll try to create a PpapiDecryptor for given | |
| 135 // |key_system|. | |
| 136 return CreatePpapiDecryptor(key_system); | |
| 137 } | |
| 138 | |
| 70 } // namespace webkit_media | 139 } // namespace webkit_media |
| OLD | NEW |