Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: content/renderer/media/crypto/ppapi_decryptor.cc

Issue 193303002: WeakPtr destruction order cleanup: media edition. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebase. Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 "content/renderer/media/crypto/ppapi_decryptor.h" 5 #include "content/renderer/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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 session_error_cb_(session_error_cb), 66 session_error_cb_(session_error_cb),
67 render_loop_proxy_(base::MessageLoopProxy::current()), 67 render_loop_proxy_(base::MessageLoopProxy::current()),
68 weak_ptr_factory_(this) { 68 weak_ptr_factory_(this) {
69 DCHECK(pepper_cdm_wrapper_.get()); 69 DCHECK(pepper_cdm_wrapper_.get());
70 DCHECK(!session_created_cb_.is_null()); 70 DCHECK(!session_created_cb_.is_null());
71 DCHECK(!session_message_cb_.is_null()); 71 DCHECK(!session_message_cb_.is_null());
72 DCHECK(!session_ready_cb_.is_null()); 72 DCHECK(!session_ready_cb_.is_null());
73 DCHECK(!session_closed_cb_.is_null()); 73 DCHECK(!session_closed_cb_.is_null());
74 DCHECK(!session_error_cb_.is_null()); 74 DCHECK(!session_error_cb_.is_null());
75 75
76 weak_this_ = weak_ptr_factory_.GetWeakPtr(); 76 base::WeakPtr<PpapiDecryptor> weak_this = weak_ptr_factory_.GetWeakPtr();
77
78 CdmDelegate()->Initialize( 77 CdmDelegate()->Initialize(
79 key_system, 78 key_system,
80 base::Bind(&PpapiDecryptor::OnSessionCreated, weak_this_), 79 base::Bind(&PpapiDecryptor::OnSessionCreated, weak_this),
81 base::Bind(&PpapiDecryptor::OnSessionMessage, weak_this_), 80 base::Bind(&PpapiDecryptor::OnSessionMessage, weak_this),
82 base::Bind(&PpapiDecryptor::OnSessionReady, weak_this_), 81 base::Bind(&PpapiDecryptor::OnSessionReady, weak_this),
83 base::Bind(&PpapiDecryptor::OnSessionClosed, weak_this_), 82 base::Bind(&PpapiDecryptor::OnSessionClosed, weak_this),
84 base::Bind(&PpapiDecryptor::OnSessionError, weak_this_), 83 base::Bind(&PpapiDecryptor::OnSessionError, weak_this),
85 base::Bind(&PpapiDecryptor::OnFatalPluginError, weak_this_)); 84 base::Bind(&PpapiDecryptor::OnFatalPluginError, weak_this));
86 } 85 }
87 86
88 PpapiDecryptor::~PpapiDecryptor() { 87 PpapiDecryptor::~PpapiDecryptor() {
89 pepper_cdm_wrapper_.reset(); 88 pepper_cdm_wrapper_.reset();
90 } 89 }
91 90
92 bool PpapiDecryptor::CreateSession(uint32 session_id, 91 bool PpapiDecryptor::CreateSession(uint32 session_id,
93 const std::string& content_type, 92 const std::string& content_type,
94 const uint8* init_data, 93 const uint8* init_data,
95 int init_data_length) { 94 int init_data_length) {
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 } 141 }
143 } 142 }
144 143
145 media::Decryptor* PpapiDecryptor::GetDecryptor() { 144 media::Decryptor* PpapiDecryptor::GetDecryptor() {
146 return this; 145 return this;
147 } 146 }
148 147
149 void PpapiDecryptor::RegisterNewKeyCB(StreamType stream_type, 148 void PpapiDecryptor::RegisterNewKeyCB(StreamType stream_type,
150 const NewKeyCB& new_key_cb) { 149 const NewKeyCB& new_key_cb) {
151 if (!render_loop_proxy_->BelongsToCurrentThread()) { 150 if (!render_loop_proxy_->BelongsToCurrentThread()) {
152 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( 151 render_loop_proxy_->PostTask(FROM_HERE,
153 &PpapiDecryptor::RegisterNewKeyCB, weak_this_, stream_type, 152 base::Bind(&PpapiDecryptor::RegisterNewKeyCB,
154 new_key_cb)); 153 weak_ptr_factory_.GetWeakPtr(),
154 stream_type,
155 new_key_cb));
155 return; 156 return;
156 } 157 }
157 158
158 DVLOG(3) << __FUNCTION__ << " - stream_type: " << stream_type; 159 DVLOG(3) << __FUNCTION__ << " - stream_type: " << stream_type;
159 switch (stream_type) { 160 switch (stream_type) {
160 case kAudio: 161 case kAudio:
161 new_audio_key_cb_ = new_key_cb; 162 new_audio_key_cb_ = new_key_cb;
162 break; 163 break;
163 case kVideo: 164 case kVideo:
164 new_video_key_cb_ = new_key_cb; 165 new_video_key_cb_ = new_key_cb;
165 break; 166 break;
166 default: 167 default:
167 NOTREACHED(); 168 NOTREACHED();
168 } 169 }
169 } 170 }
170 171
171 void PpapiDecryptor::Decrypt( 172 void PpapiDecryptor::Decrypt(
172 StreamType stream_type, 173 StreamType stream_type,
173 const scoped_refptr<media::DecoderBuffer>& encrypted, 174 const scoped_refptr<media::DecoderBuffer>& encrypted,
174 const DecryptCB& decrypt_cb) { 175 const DecryptCB& decrypt_cb) {
175 if (!render_loop_proxy_->BelongsToCurrentThread()) { 176 if (!render_loop_proxy_->BelongsToCurrentThread()) {
176 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( 177 render_loop_proxy_->PostTask(FROM_HERE,
177 &PpapiDecryptor::Decrypt, weak_this_, 178 base::Bind(&PpapiDecryptor::Decrypt,
178 stream_type, encrypted, decrypt_cb)); 179 weak_ptr_factory_.GetWeakPtr(),
180 stream_type,
181 encrypted,
182 decrypt_cb));
179 return; 183 return;
180 } 184 }
181 185
182 DVLOG(3) << __FUNCTION__ << " - stream_type: " << stream_type; 186 DVLOG(3) << __FUNCTION__ << " - stream_type: " << stream_type;
183 if (!CdmDelegate() || 187 if (!CdmDelegate() ||
184 !CdmDelegate()->Decrypt(stream_type, encrypted, decrypt_cb)) { 188 !CdmDelegate()->Decrypt(stream_type, encrypted, decrypt_cb)) {
185 decrypt_cb.Run(kError, NULL); 189 decrypt_cb.Run(kError, NULL);
186 } 190 }
187 } 191 }
188 192
189 void PpapiDecryptor::CancelDecrypt(StreamType stream_type) { 193 void PpapiDecryptor::CancelDecrypt(StreamType stream_type) {
190 if (!render_loop_proxy_->BelongsToCurrentThread()) { 194 if (!render_loop_proxy_->BelongsToCurrentThread()) {
191 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( 195 render_loop_proxy_->PostTask(FROM_HERE,
192 &PpapiDecryptor::CancelDecrypt, weak_this_, stream_type)); 196 base::Bind(&PpapiDecryptor::CancelDecrypt,
197 weak_ptr_factory_.GetWeakPtr(),
198 stream_type));
193 return; 199 return;
194 } 200 }
195 201
196 DVLOG(1) << __FUNCTION__ << " - stream_type: " << stream_type; 202 DVLOG(1) << __FUNCTION__ << " - stream_type: " << stream_type;
197 if (CdmDelegate()) 203 if (CdmDelegate())
198 CdmDelegate()->CancelDecrypt(stream_type); 204 CdmDelegate()->CancelDecrypt(stream_type);
199 } 205 }
200 206
201 void PpapiDecryptor::InitializeAudioDecoder( 207 void PpapiDecryptor::InitializeAudioDecoder(
202 const media::AudioDecoderConfig& config, 208 const media::AudioDecoderConfig& config,
203 const DecoderInitCB& init_cb) { 209 const DecoderInitCB& init_cb) {
204 if (!render_loop_proxy_->BelongsToCurrentThread()) { 210 if (!render_loop_proxy_->BelongsToCurrentThread()) {
205 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( 211 render_loop_proxy_->PostTask(
206 &PpapiDecryptor::InitializeAudioDecoder, weak_this_, config, init_cb)); 212 FROM_HERE,
213 base::Bind(&PpapiDecryptor::InitializeAudioDecoder,
214 weak_ptr_factory_.GetWeakPtr(),
215 config,
216 init_cb));
207 return; 217 return;
208 } 218 }
209 219
210 DVLOG(2) << __FUNCTION__; 220 DVLOG(2) << __FUNCTION__;
211 DCHECK(config.is_encrypted()); 221 DCHECK(config.is_encrypted());
212 DCHECK(config.IsValidConfig()); 222 DCHECK(config.IsValidConfig());
213 223
214 audio_decoder_init_cb_ = init_cb; 224 audio_decoder_init_cb_ = init_cb;
215 if (!CdmDelegate() || 225 if (!CdmDelegate() || !CdmDelegate()->InitializeAudioDecoder(
216 !CdmDelegate()->InitializeAudioDecoder( 226 config,
217 config, 227 base::Bind(&PpapiDecryptor::OnDecoderInitialized,
218 base::Bind( 228 weak_ptr_factory_.GetWeakPtr(),
219 &PpapiDecryptor::OnDecoderInitialized, weak_this_, kAudio))) { 229 kAudio))) {
220 base::ResetAndReturn(&audio_decoder_init_cb_).Run(false); 230 base::ResetAndReturn(&audio_decoder_init_cb_).Run(false);
221 return; 231 return;
222 } 232 }
223 } 233 }
224 234
225 void PpapiDecryptor::InitializeVideoDecoder( 235 void PpapiDecryptor::InitializeVideoDecoder(
226 const media::VideoDecoderConfig& config, 236 const media::VideoDecoderConfig& config,
227 const DecoderInitCB& init_cb) { 237 const DecoderInitCB& init_cb) {
228 if (!render_loop_proxy_->BelongsToCurrentThread()) { 238 if (!render_loop_proxy_->BelongsToCurrentThread()) {
229 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( 239 render_loop_proxy_->PostTask(
230 &PpapiDecryptor::InitializeVideoDecoder, weak_this_, config, init_cb)); 240 FROM_HERE,
241 base::Bind(&PpapiDecryptor::InitializeVideoDecoder,
242 weak_ptr_factory_.GetWeakPtr(),
243 config,
244 init_cb));
231 return; 245 return;
232 } 246 }
233 247
234 DVLOG(2) << __FUNCTION__; 248 DVLOG(2) << __FUNCTION__;
235 DCHECK(config.is_encrypted()); 249 DCHECK(config.is_encrypted());
236 DCHECK(config.IsValidConfig()); 250 DCHECK(config.IsValidConfig());
237 251
238 video_decoder_init_cb_ = init_cb; 252 video_decoder_init_cb_ = init_cb;
239 if (!CdmDelegate() || 253 if (!CdmDelegate() || !CdmDelegate()->InitializeVideoDecoder(
240 !CdmDelegate()->InitializeVideoDecoder( 254 config,
241 config, 255 base::Bind(&PpapiDecryptor::OnDecoderInitialized,
242 base::Bind( 256 weak_ptr_factory_.GetWeakPtr(),
243 &PpapiDecryptor::OnDecoderInitialized, weak_this_, kVideo))) { 257 kVideo))) {
244 base::ResetAndReturn(&video_decoder_init_cb_).Run(false); 258 base::ResetAndReturn(&video_decoder_init_cb_).Run(false);
245 return; 259 return;
246 } 260 }
247 } 261 }
248 262
249 void PpapiDecryptor::DecryptAndDecodeAudio( 263 void PpapiDecryptor::DecryptAndDecodeAudio(
250 const scoped_refptr<media::DecoderBuffer>& encrypted, 264 const scoped_refptr<media::DecoderBuffer>& encrypted,
251 const AudioDecodeCB& audio_decode_cb) { 265 const AudioDecodeCB& audio_decode_cb) {
252 if (!render_loop_proxy_->BelongsToCurrentThread()) { 266 if (!render_loop_proxy_->BelongsToCurrentThread()) {
253 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( 267 render_loop_proxy_->PostTask(
254 &PpapiDecryptor::DecryptAndDecodeAudio, weak_this_, 268 FROM_HERE,
255 encrypted, audio_decode_cb)); 269 base::Bind(&PpapiDecryptor::DecryptAndDecodeAudio,
270 weak_ptr_factory_.GetWeakPtr(),
271 encrypted,
272 audio_decode_cb));
256 return; 273 return;
257 } 274 }
258 275
259 DVLOG(3) << __FUNCTION__; 276 DVLOG(3) << __FUNCTION__;
260 if (!CdmDelegate() || 277 if (!CdmDelegate() ||
261 !CdmDelegate()->DecryptAndDecodeAudio(encrypted, audio_decode_cb)) { 278 !CdmDelegate()->DecryptAndDecodeAudio(encrypted, audio_decode_cb)) {
262 audio_decode_cb.Run(kError, AudioBuffers()); 279 audio_decode_cb.Run(kError, AudioBuffers());
263 } 280 }
264 } 281 }
265 282
266 void PpapiDecryptor::DecryptAndDecodeVideo( 283 void PpapiDecryptor::DecryptAndDecodeVideo(
267 const scoped_refptr<media::DecoderBuffer>& encrypted, 284 const scoped_refptr<media::DecoderBuffer>& encrypted,
268 const VideoDecodeCB& video_decode_cb) { 285 const VideoDecodeCB& video_decode_cb) {
269 if (!render_loop_proxy_->BelongsToCurrentThread()) { 286 if (!render_loop_proxy_->BelongsToCurrentThread()) {
270 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( 287 render_loop_proxy_->PostTask(
271 &PpapiDecryptor::DecryptAndDecodeVideo, weak_this_, 288 FROM_HERE,
272 encrypted, video_decode_cb)); 289 base::Bind(&PpapiDecryptor::DecryptAndDecodeVideo,
290 weak_ptr_factory_.GetWeakPtr(),
291 encrypted,
292 video_decode_cb));
273 return; 293 return;
274 } 294 }
275 295
276 DVLOG(3) << __FUNCTION__; 296 DVLOG(3) << __FUNCTION__;
277 if (!CdmDelegate() || 297 if (!CdmDelegate() ||
278 !CdmDelegate()->DecryptAndDecodeVideo(encrypted, video_decode_cb)) { 298 !CdmDelegate()->DecryptAndDecodeVideo(encrypted, video_decode_cb)) {
279 video_decode_cb.Run(kError, NULL); 299 video_decode_cb.Run(kError, NULL);
280 } 300 }
281 } 301 }
282 302
283 void PpapiDecryptor::ResetDecoder(StreamType stream_type) { 303 void PpapiDecryptor::ResetDecoder(StreamType stream_type) {
284 if (!render_loop_proxy_->BelongsToCurrentThread()) { 304 if (!render_loop_proxy_->BelongsToCurrentThread()) {
285 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( 305 render_loop_proxy_->PostTask(FROM_HERE,
286 &PpapiDecryptor::ResetDecoder, weak_this_, stream_type)); 306 base::Bind(&PpapiDecryptor::ResetDecoder,
307 weak_ptr_factory_.GetWeakPtr(),
308 stream_type));
287 return; 309 return;
288 } 310 }
289 311
290 DVLOG(2) << __FUNCTION__ << " - stream_type: " << stream_type; 312 DVLOG(2) << __FUNCTION__ << " - stream_type: " << stream_type;
291 if (CdmDelegate()) 313 if (CdmDelegate())
292 CdmDelegate()->ResetDecoder(stream_type); 314 CdmDelegate()->ResetDecoder(stream_type);
293 } 315 }
294 316
295 void PpapiDecryptor::DeinitializeDecoder(StreamType stream_type) { 317 void PpapiDecryptor::DeinitializeDecoder(StreamType stream_type) {
296 if (!render_loop_proxy_->BelongsToCurrentThread()) { 318 if (!render_loop_proxy_->BelongsToCurrentThread()) {
297 render_loop_proxy_->PostTask(FROM_HERE, base::Bind( 319 render_loop_proxy_->PostTask(
298 &PpapiDecryptor::DeinitializeDecoder, weak_this_, stream_type)); 320 FROM_HERE,
321 base::Bind(&PpapiDecryptor::DeinitializeDecoder,
322 weak_ptr_factory_.GetWeakPtr(),
323 stream_type));
299 return; 324 return;
300 } 325 }
301 326
302 DVLOG(2) << __FUNCTION__ << " - stream_type: " << stream_type; 327 DVLOG(2) << __FUNCTION__ << " - stream_type: " << stream_type;
303 if (CdmDelegate()) 328 if (CdmDelegate())
304 CdmDelegate()->DeinitializeDecoder(stream_type); 329 CdmDelegate()->DeinitializeDecoder(stream_type);
305 } 330 }
306 331
307 void PpapiDecryptor::ReportFailureToCallPlugin(uint32 session_id) { 332 void PpapiDecryptor::ReportFailureToCallPlugin(uint32 session_id) {
308 DCHECK(render_loop_proxy_->BelongsToCurrentThread()); 333 DCHECK(render_loop_proxy_->BelongsToCurrentThread());
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
374 DCHECK(render_loop_proxy_->BelongsToCurrentThread()); 399 DCHECK(render_loop_proxy_->BelongsToCurrentThread());
375 pepper_cdm_wrapper_.reset(); 400 pepper_cdm_wrapper_.reset();
376 } 401 }
377 402
378 ContentDecryptorDelegate* PpapiDecryptor::CdmDelegate() { 403 ContentDecryptorDelegate* PpapiDecryptor::CdmDelegate() {
379 DCHECK(render_loop_proxy_->BelongsToCurrentThread()); 404 DCHECK(render_loop_proxy_->BelongsToCurrentThread());
380 return (pepper_cdm_wrapper_) ? pepper_cdm_wrapper_->GetCdmDelegate() : NULL; 405 return (pepper_cdm_wrapper_) ? pepper_cdm_wrapper_->GetCdmDelegate() : NULL;
381 } 406 }
382 407
383 } // namespace content 408 } // namespace content
OLDNEW
« no previous file with comments | « content/renderer/media/crypto/ppapi_decryptor.h ('k') | content/renderer/media/crypto/proxy_decryptor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698