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/ppapi_decryptor.h" | 5 #include "webkit/media/crypto/ppapi_decryptor.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/callback_helpers.h" | 10 #include "base/callback_helpers.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 cdm_plugin_(plugin_instance), | 29 cdm_plugin_(plugin_instance), |
30 render_loop_proxy_(base::MessageLoopProxy::current()), | 30 render_loop_proxy_(base::MessageLoopProxy::current()), |
31 weak_ptr_factory_(this), | 31 weak_ptr_factory_(this), |
32 weak_this_(weak_ptr_factory_.GetWeakPtr()) { | 32 weak_this_(weak_ptr_factory_.GetWeakPtr()) { |
33 DCHECK(client_); | 33 DCHECK(client_); |
34 DCHECK(cdm_plugin_); | 34 DCHECK(cdm_plugin_); |
35 cdm_plugin_->set_decrypt_client(client); | 35 cdm_plugin_->set_decrypt_client(client); |
36 } | 36 } |
37 | 37 |
38 PpapiDecryptor::~PpapiDecryptor() { | 38 PpapiDecryptor::~PpapiDecryptor() { |
| 39 cdm_plugin_->set_decrypt_client(NULL); |
39 } | 40 } |
40 | 41 |
41 bool PpapiDecryptor::GenerateKeyRequest(const std::string& key_system, | 42 bool PpapiDecryptor::GenerateKeyRequest(const std::string& key_system, |
42 const uint8* init_data, | 43 const uint8* init_data, |
43 int init_data_length) { | 44 int init_data_length) { |
44 DVLOG(2) << "GenerateKeyRequest()"; | 45 DVLOG(2) << "GenerateKeyRequest()"; |
45 DCHECK(render_loop_proxy_->BelongsToCurrentThread()); | 46 DCHECK(render_loop_proxy_->BelongsToCurrentThread()); |
46 DCHECK(cdm_plugin_); | 47 DCHECK(cdm_plugin_); |
47 | 48 |
48 // TODO(xhwang): Finalize the data type for |init_data| to avoid unnecessary | 49 // TODO(xhwang): Finalize the data type for |init_data| to avoid unnecessary |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
98 const scoped_refptr<media::DecoderBuffer>& encrypted, | 99 const scoped_refptr<media::DecoderBuffer>& encrypted, |
99 const DecryptCB& decrypt_cb) { | 100 const DecryptCB& decrypt_cb) { |
100 if (!render_loop_proxy_->BelongsToCurrentThread()) { | 101 if (!render_loop_proxy_->BelongsToCurrentThread()) { |
101 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( | 102 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
102 &PpapiDecryptor::Decrypt, weak_this_, | 103 &PpapiDecryptor::Decrypt, weak_this_, |
103 stream_type, encrypted, decrypt_cb)); | 104 stream_type, encrypted, decrypt_cb)); |
104 return; | 105 return; |
105 } | 106 } |
106 | 107 |
107 DVLOG(3) << "Decrypt() - stream_type: " << stream_type; | 108 DVLOG(3) << "Decrypt() - stream_type: " << stream_type; |
108 if (!cdm_plugin_->Decrypt(encrypted, decrypt_cb)) | 109 if (!cdm_plugin_->Decrypt(stream_type, encrypted, decrypt_cb)) |
109 decrypt_cb.Run(kError, NULL); | 110 decrypt_cb.Run(kError, NULL); |
110 } | 111 } |
111 | 112 |
112 void PpapiDecryptor::CancelDecrypt(StreamType stream_type) { | 113 void PpapiDecryptor::CancelDecrypt(StreamType stream_type) { |
113 DVLOG(1) << "CancelDecrypt() - stream_type: " << stream_type; | 114 DVLOG(1) << "CancelDecrypt() - stream_type: " << stream_type; |
114 // TODO(xhwang): Implement CancelDecrypt() in PluginInstance and call it here. | 115 cdm_plugin_->CancelDecrypt(stream_type); |
115 } | 116 } |
116 | 117 |
117 void PpapiDecryptor::InitializeAudioDecoder( | 118 void PpapiDecryptor::InitializeAudioDecoder( |
118 scoped_ptr<media::AudioDecoderConfig> config, | 119 scoped_ptr<media::AudioDecoderConfig> config, |
119 const DecoderInitCB& init_cb, | 120 const DecoderInitCB& init_cb, |
120 const KeyAddedCB& key_added_cb) { | 121 const KeyAddedCB& key_added_cb) { |
121 if (!render_loop_proxy_->BelongsToCurrentThread()) { | 122 if (!render_loop_proxy_->BelongsToCurrentThread()) { |
122 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( | 123 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
123 &PpapiDecryptor::InitializeAudioDecoder, weak_this_, | 124 &PpapiDecryptor::InitializeAudioDecoder, weak_this_, |
124 base::Passed(&config), init_cb, key_added_cb)); | 125 base::Passed(&config), init_cb, key_added_cb)); |
125 return; | 126 return; |
126 } | 127 } |
127 | 128 |
128 DVLOG(2) << "InitializeAudioDecoder()"; | 129 DVLOG(2) << "InitializeAudioDecoder()"; |
129 DCHECK(config->is_encrypted()); | 130 DCHECK(config->is_encrypted()); |
130 DCHECK(config->IsValidConfig()); | 131 DCHECK(config->IsValidConfig()); |
131 | 132 |
132 audio_decoder_init_cb_ = init_cb; | 133 audio_decoder_init_cb_ = init_cb; |
133 // TODO(xhwang): Implement InitializeAudioDecoder() in PluginInstance and call | |
134 // it here. | |
135 NOTIMPLEMENTED(); | |
136 #if 0 | |
137 if (!cdm_plugin_->InitializeAudioDecoder(*config, base::Bind( | 134 if (!cdm_plugin_->InitializeAudioDecoder(*config, base::Bind( |
138 &PpapiDecryptor::OnDecoderInitialized, weak_this_, | 135 &PpapiDecryptor::OnDecoderInitialized, weak_this_, |
139 kAudio, key_added_cb))) { | 136 kAudio, key_added_cb))) { |
140 #endif | |
141 base::ResetAndReturn(&audio_decoder_init_cb_).Run(false); | 137 base::ResetAndReturn(&audio_decoder_init_cb_).Run(false); |
142 #if 0 | |
143 return; | 138 return; |
144 } | 139 } |
145 #endif | |
146 } | 140 } |
147 | 141 |
148 void PpapiDecryptor::InitializeVideoDecoder( | 142 void PpapiDecryptor::InitializeVideoDecoder( |
149 scoped_ptr<media::VideoDecoderConfig> config, | 143 scoped_ptr<media::VideoDecoderConfig> config, |
150 const DecoderInitCB& init_cb, | 144 const DecoderInitCB& init_cb, |
151 const KeyAddedCB& key_added_cb) { | 145 const KeyAddedCB& key_added_cb) { |
152 if (!render_loop_proxy_->BelongsToCurrentThread()) { | 146 if (!render_loop_proxy_->BelongsToCurrentThread()) { |
153 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( | 147 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
154 &PpapiDecryptor::InitializeVideoDecoder, weak_this_, | 148 &PpapiDecryptor::InitializeVideoDecoder, weak_this_, |
155 base::Passed(&config), init_cb, key_added_cb)); | 149 base::Passed(&config), init_cb, key_added_cb)); |
(...skipping 17 matching lines...) Expand all Loading... |
173 const scoped_refptr<media::DecoderBuffer>& encrypted, | 167 const scoped_refptr<media::DecoderBuffer>& encrypted, |
174 const AudioDecodeCB& audio_decode_cb) { | 168 const AudioDecodeCB& audio_decode_cb) { |
175 if (!render_loop_proxy_->BelongsToCurrentThread()) { | 169 if (!render_loop_proxy_->BelongsToCurrentThread()) { |
176 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( | 170 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
177 &PpapiDecryptor::DecryptAndDecodeAudio, weak_this_, | 171 &PpapiDecryptor::DecryptAndDecodeAudio, weak_this_, |
178 encrypted, audio_decode_cb)); | 172 encrypted, audio_decode_cb)); |
179 return; | 173 return; |
180 } | 174 } |
181 | 175 |
182 DVLOG(1) << "DecryptAndDecodeAudio()"; | 176 DVLOG(1) << "DecryptAndDecodeAudio()"; |
183 NOTIMPLEMENTED(); | |
184 // TODO(xhwang): Enable this once PluginInstance is updated. | |
185 #if 0 | |
186 if (!cdm_plugin_->DecryptAndDecodeAudio(encrypted, audio_decode_cb)) | 177 if (!cdm_plugin_->DecryptAndDecodeAudio(encrypted, audio_decode_cb)) |
187 #endif | |
188 audio_decode_cb.Run(kError, AudioBuffers()); | 178 audio_decode_cb.Run(kError, AudioBuffers()); |
189 } | 179 } |
190 | 180 |
191 void PpapiDecryptor::DecryptAndDecodeVideo( | 181 void PpapiDecryptor::DecryptAndDecodeVideo( |
192 const scoped_refptr<media::DecoderBuffer>& encrypted, | 182 const scoped_refptr<media::DecoderBuffer>& encrypted, |
193 const VideoDecodeCB& video_decode_cb) { | 183 const VideoDecodeCB& video_decode_cb) { |
194 if (!render_loop_proxy_->BelongsToCurrentThread()) { | 184 if (!render_loop_proxy_->BelongsToCurrentThread()) { |
195 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( | 185 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
196 &PpapiDecryptor::DecryptAndDecodeVideo, weak_this_, | 186 &PpapiDecryptor::DecryptAndDecodeVideo, weak_this_, |
197 encrypted, video_decode_cb)); | 187 encrypted, video_decode_cb)); |
198 return; | 188 return; |
199 } | 189 } |
200 | 190 |
201 DVLOG(3) << "DecryptAndDecodeVideo()"; | 191 DVLOG(3) << "DecryptAndDecodeVideo()"; |
202 if (!cdm_plugin_->DecryptAndDecode(encrypted, video_decode_cb)) | 192 if (!cdm_plugin_->DecryptAndDecodeVideo(encrypted, video_decode_cb)) |
203 video_decode_cb.Run(kError, NULL); | 193 video_decode_cb.Run(kError, NULL); |
204 } | 194 } |
205 | 195 |
206 void PpapiDecryptor::ResetDecoder(StreamType stream_type) { | 196 void PpapiDecryptor::ResetDecoder(StreamType stream_type) { |
207 if (!render_loop_proxy_->BelongsToCurrentThread()) { | 197 if (!render_loop_proxy_->BelongsToCurrentThread()) { |
208 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( | 198 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
209 &PpapiDecryptor::ResetDecoder, weak_this_, stream_type)); | 199 &PpapiDecryptor::ResetDecoder, weak_this_, stream_type)); |
210 return; | 200 return; |
211 } | 201 } |
212 | 202 |
213 DVLOG(2) << "ResetDecoder() - stream_type: " << stream_type; | 203 DVLOG(2) << "ResetDecoder() - stream_type: " << stream_type; |
214 // TODO(xhwang): Support stream type in PluginInstance. | 204 cdm_plugin_->ResetDecoder(stream_type); |
215 cdm_plugin_->ResetDecoder(); | |
216 } | 205 } |
217 | 206 |
218 void PpapiDecryptor::DeinitializeDecoder(StreamType stream_type) { | 207 void PpapiDecryptor::DeinitializeDecoder(StreamType stream_type) { |
219 if (!render_loop_proxy_->BelongsToCurrentThread()) { | 208 if (!render_loop_proxy_->BelongsToCurrentThread()) { |
220 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( | 209 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( |
221 &PpapiDecryptor::DeinitializeDecoder, weak_this_, stream_type)); | 210 &PpapiDecryptor::DeinitializeDecoder, weak_this_, stream_type)); |
222 return; | 211 return; |
223 } | 212 } |
224 DVLOG(2) << "DeinitializeDecoder() - stream_type: " << stream_type; | 213 DVLOG(2) << "DeinitializeDecoder() - stream_type: " << stream_type; |
225 // TODO(xhwang): Support stream type in PluginInstance. | 214 cdm_plugin_->DeinitializeDecoder(stream_type); |
226 cdm_plugin_->DeinitializeDecoder(); | |
227 } | 215 } |
228 | 216 |
229 void PpapiDecryptor::ReportFailureToCallPlugin(const std::string& key_system, | 217 void PpapiDecryptor::ReportFailureToCallPlugin(const std::string& key_system, |
230 const std::string& session_id) { | 218 const std::string& session_id) { |
231 DVLOG(1) << "Failed to call plugin."; | 219 DVLOG(1) << "Failed to call plugin."; |
232 client_->KeyError(key_system, session_id, kUnknownError, 0); | 220 client_->KeyError(key_system, session_id, kUnknownError, 0); |
233 } | 221 } |
234 | 222 |
235 void PpapiDecryptor::OnDecoderInitialized(StreamType stream_type, | 223 void PpapiDecryptor::OnDecoderInitialized(StreamType stream_type, |
236 const KeyAddedCB& key_added_cb, | 224 const KeyAddedCB& key_added_cb, |
(...skipping 16 matching lines...) Expand all Loading... |
253 video_key_added_cb_ = key_added_cb; | 241 video_key_added_cb_ = key_added_cb; |
254 base::ResetAndReturn(&video_decoder_init_cb_).Run(success); | 242 base::ResetAndReturn(&video_decoder_init_cb_).Run(success); |
255 break; | 243 break; |
256 | 244 |
257 default: | 245 default: |
258 NOTREACHED(); | 246 NOTREACHED(); |
259 } | 247 } |
260 } | 248 } |
261 | 249 |
262 } // namespace webkit_media | 250 } // namespace webkit_media |
OLD | NEW |