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

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

Issue 1102363005: Initialize the CDM asynchronously (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Create() changes Created 5 years, 7 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
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/logging.h" 10 #include "base/logging.h"
11 #include "base/message_loop/message_loop.h" 11 #include "base/message_loop/message_loop.h"
12 #include "base/message_loop/message_loop_proxy.h" 12 #include "base/message_loop/message_loop_proxy.h"
13 #include "content/renderer/media/crypto/cdm_initialized_promise.h"
13 #include "content/renderer/pepper/content_decryptor_delegate.h" 14 #include "content/renderer/pepper/content_decryptor_delegate.h"
14 #include "content/renderer/pepper/pepper_plugin_instance_impl.h" 15 #include "content/renderer/pepper/pepper_plugin_instance_impl.h"
15 #include "media/base/audio_decoder_config.h" 16 #include "media/base/audio_decoder_config.h"
16 #include "media/base/cdm_key_information.h" 17 #include "media/base/cdm_key_information.h"
17 #include "media/base/data_buffer.h" 18 #include "media/base/data_buffer.h"
18 #include "media/base/decoder_buffer.h" 19 #include "media/base/decoder_buffer.h"
19 #include "media/base/key_systems.h" 20 #include "media/base/key_systems.h"
20 #include "media/base/video_decoder_config.h" 21 #include "media/base/video_decoder_config.h"
21 #include "media/base/video_frame.h" 22 #include "media/base/video_frame.h"
22 23
23 namespace content { 24 namespace content {
24 25
25 scoped_ptr<PpapiDecryptor> PpapiDecryptor::Create( 26 void PpapiDecryptor::Create(
26 const std::string& key_system, 27 const std::string& key_system,
27 bool allow_distinctive_identifier, 28 bool allow_distinctive_identifier,
28 bool allow_persistent_state, 29 bool allow_persistent_state,
29 const GURL& security_origin, 30 const GURL& security_origin,
30 const CreatePepperCdmCB& create_pepper_cdm_cb, 31 const CreatePepperCdmCB& create_pepper_cdm_cb,
31 const media::SessionMessageCB& session_message_cb, 32 const media::SessionMessageCB& session_message_cb,
32 const media::SessionClosedCB& session_closed_cb, 33 const media::SessionClosedCB& session_closed_cb,
33 const media::LegacySessionErrorCB& legacy_session_error_cb, 34 const media::LegacySessionErrorCB& legacy_session_error_cb,
34 const media::SessionKeysChangeCB& session_keys_change_cb, 35 const media::SessionKeysChangeCB& session_keys_change_cb,
35 const media::SessionExpirationUpdateCB& session_expiration_update_cb) { 36 const media::SessionExpirationUpdateCB& session_expiration_update_cb,
37 const media::CdmCreatedCB& cdm_created_cb) {
36 std::string plugin_type = media::GetPepperType(key_system); 38 std::string plugin_type = media::GetPepperType(key_system);
37 DCHECK(!plugin_type.empty()); 39 DCHECK(!plugin_type.empty());
38 scoped_ptr<PepperCdmWrapper> pepper_cdm_wrapper = 40 scoped_ptr<PepperCdmWrapper> pepper_cdm_wrapper =
39 create_pepper_cdm_cb.Run(plugin_type, security_origin); 41 create_pepper_cdm_cb.Run(plugin_type, security_origin);
40 if (!pepper_cdm_wrapper) { 42 if (!pepper_cdm_wrapper) {
41 DLOG(ERROR) << "Plugin instance creation failed."; 43 DLOG(ERROR) << "Plugin instance creation failed.";
42 return scoped_ptr<PpapiDecryptor>(); 44 base::MessageLoopProxy::current()->PostTask(
45 FROM_HERE, base::Bind(cdm_created_cb, nullptr));
43 } 46 }
44 47
45 return scoped_ptr<PpapiDecryptor>(new PpapiDecryptor( 48 scoped_ptr<PpapiDecryptor> ppapi_decryptor(
46 key_system, allow_distinctive_identifier, allow_persistent_state, 49 new PpapiDecryptor(pepper_cdm_wrapper.Pass(), session_message_cb,
47 pepper_cdm_wrapper.Pass(), session_message_cb, session_closed_cb, 50 session_closed_cb, legacy_session_error_cb,
48 legacy_session_error_cb, session_keys_change_cb, 51 session_keys_change_cb, session_expiration_update_cb));
49 session_expiration_update_cb)); 52 if (!ppapi_decryptor) {
ddorwin 2015/05/04 22:46:02 No need to worry about constructor failure.
jrummell 2015/05/05 00:54:17 Done.
53 base::MessageLoopProxy::current()->PostTask(
54 FROM_HERE, base::Bind(cdm_created_cb, nullptr));
55 return;
56 }
57
58 // PpapiDecryptor ownership passed to the promise, but keep a copy in order
59 // to call InitializeCdm().
60 PpapiDecryptor* ppapi_decryptor_copy = ppapi_decryptor.get();
61 scoped_ptr<CdmInitializedPromise> promise(
62 new CdmInitializedPromise(cdm_created_cb, ppapi_decryptor.Pass()));
63 ppapi_decryptor_copy->InitializeCdm(key_system, allow_distinctive_identifier,
64 allow_persistent_state, promise.Pass());
50 } 65 }
51 66
52 PpapiDecryptor::PpapiDecryptor( 67 PpapiDecryptor::PpapiDecryptor(
53 const std::string& key_system,
54 bool allow_distinctive_identifier,
55 bool allow_persistent_state,
56 scoped_ptr<PepperCdmWrapper> pepper_cdm_wrapper, 68 scoped_ptr<PepperCdmWrapper> pepper_cdm_wrapper,
57 const media::SessionMessageCB& session_message_cb, 69 const media::SessionMessageCB& session_message_cb,
58 const media::SessionClosedCB& session_closed_cb, 70 const media::SessionClosedCB& session_closed_cb,
59 const media::LegacySessionErrorCB& legacy_session_error_cb, 71 const media::LegacySessionErrorCB& legacy_session_error_cb,
60 const media::SessionKeysChangeCB& session_keys_change_cb, 72 const media::SessionKeysChangeCB& session_keys_change_cb,
61 const media::SessionExpirationUpdateCB& session_expiration_update_cb) 73 const media::SessionExpirationUpdateCB& session_expiration_update_cb)
62 : pepper_cdm_wrapper_(pepper_cdm_wrapper.Pass()), 74 : pepper_cdm_wrapper_(pepper_cdm_wrapper.Pass()),
63 session_message_cb_(session_message_cb), 75 session_message_cb_(session_message_cb),
64 session_closed_cb_(session_closed_cb), 76 session_closed_cb_(session_closed_cb),
65 legacy_session_error_cb_(legacy_session_error_cb), 77 legacy_session_error_cb_(legacy_session_error_cb),
66 session_keys_change_cb_(session_keys_change_cb), 78 session_keys_change_cb_(session_keys_change_cb),
67 session_expiration_update_cb_(session_expiration_update_cb), 79 session_expiration_update_cb_(session_expiration_update_cb),
68 render_loop_proxy_(base::MessageLoopProxy::current()), 80 render_loop_proxy_(base::MessageLoopProxy::current()),
69 weak_ptr_factory_(this) { 81 weak_ptr_factory_(this) {
70 DCHECK(pepper_cdm_wrapper_.get()); 82 DCHECK(pepper_cdm_wrapper_.get());
71 DCHECK(!session_message_cb_.is_null()); 83 DCHECK(!session_message_cb_.is_null());
72 DCHECK(!session_closed_cb_.is_null()); 84 DCHECK(!session_closed_cb_.is_null());
73 DCHECK(!legacy_session_error_cb_.is_null()); 85 DCHECK(!legacy_session_error_cb_.is_null());
74 DCHECK(!session_keys_change_cb.is_null()); 86 DCHECK(!session_keys_change_cb.is_null());
75 DCHECK(!session_expiration_update_cb.is_null()); 87 DCHECK(!session_expiration_update_cb.is_null());
88 }
76 89
90 PpapiDecryptor::~PpapiDecryptor() {
91 pepper_cdm_wrapper_.reset();
92 }
93
94 void PpapiDecryptor::InitializeCdm(
95 const std::string& key_system,
96 bool allow_distinctive_identifier,
97 bool allow_persistent_state,
98 scoped_ptr<media::SimpleCdmPromise> promise) {
77 base::WeakPtr<PpapiDecryptor> weak_this = weak_ptr_factory_.GetWeakPtr(); 99 base::WeakPtr<PpapiDecryptor> weak_this = weak_ptr_factory_.GetWeakPtr();
78 CdmDelegate()->Initialize( 100 CdmDelegate()->Initialize(
79 key_system, allow_distinctive_identifier, allow_persistent_state, 101 key_system, allow_distinctive_identifier, allow_persistent_state,
80 base::Bind(&PpapiDecryptor::OnSessionMessage, weak_this), 102 base::Bind(&PpapiDecryptor::OnSessionMessage, weak_this),
81 base::Bind(&PpapiDecryptor::OnSessionClosed, weak_this), 103 base::Bind(&PpapiDecryptor::OnSessionClosed, weak_this),
82 base::Bind(&PpapiDecryptor::OnLegacySessionError, weak_this), 104 base::Bind(&PpapiDecryptor::OnLegacySessionError, weak_this),
83 base::Bind(&PpapiDecryptor::OnSessionKeysChange, weak_this), 105 base::Bind(&PpapiDecryptor::OnSessionKeysChange, weak_this),
84 base::Bind(&PpapiDecryptor::OnSessionExpirationUpdate, weak_this), 106 base::Bind(&PpapiDecryptor::OnSessionExpirationUpdate, weak_this),
85 base::Bind(&PpapiDecryptor::OnFatalPluginError, weak_this)); 107 base::Bind(&PpapiDecryptor::OnFatalPluginError, weak_this),
86 } 108 promise.Pass());
87
88 PpapiDecryptor::~PpapiDecryptor() {
89 pepper_cdm_wrapper_.reset();
90 } 109 }
91 110
92 void PpapiDecryptor::SetServerCertificate( 111 void PpapiDecryptor::SetServerCertificate(
93 const std::vector<uint8_t>& certificate, 112 const std::vector<uint8_t>& certificate,
94 scoped_ptr<media::SimpleCdmPromise> promise) { 113 scoped_ptr<media::SimpleCdmPromise> promise) {
95 DVLOG(2) << __FUNCTION__; 114 DVLOG(2) << __FUNCTION__;
96 DCHECK(render_loop_proxy_->BelongsToCurrentThread()); 115 DCHECK(render_loop_proxy_->BelongsToCurrentThread());
97 116
98 if (!CdmDelegate()) { 117 if (!CdmDelegate()) {
99 promise->reject(INVALID_STATE_ERROR, 0, "CdmDelegate() does not exist."); 118 promise->reject(INVALID_STATE_ERROR, 0, "CdmDelegate() does not exist.");
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 DCHECK(render_loop_proxy_->BelongsToCurrentThread()); 461 DCHECK(render_loop_proxy_->BelongsToCurrentThread());
443 pepper_cdm_wrapper_.reset(); 462 pepper_cdm_wrapper_.reset();
444 } 463 }
445 464
446 ContentDecryptorDelegate* PpapiDecryptor::CdmDelegate() { 465 ContentDecryptorDelegate* PpapiDecryptor::CdmDelegate() {
447 DCHECK(render_loop_proxy_->BelongsToCurrentThread()); 466 DCHECK(render_loop_proxy_->BelongsToCurrentThread());
448 return (pepper_cdm_wrapper_) ? pepper_cdm_wrapper_->GetCdmDelegate() : NULL; 467 return (pepper_cdm_wrapper_) ? pepper_cdm_wrapper_->GetCdmDelegate() : NULL;
449 } 468 }
450 469
451 } // namespace content 470 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698