OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "chromecast/media/cdm/browser_cdm_cast.h" | 5 #include "chromecast/media/cdm/browser_cdm_cast.h" |
6 | 6 |
7 #include "media/base/cdm_key_information.h" | 7 #include "media/base/cdm_key_information.h" |
8 | 8 |
9 namespace chromecast { | 9 namespace chromecast { |
10 namespace media { | 10 namespace media { |
11 | 11 |
12 BrowserCdmCast::BrowserCdmCast() { | 12 BrowserCdmCast::BrowserCdmCast() |
| 13 : next_registration_id_(0) { |
13 } | 14 } |
14 | 15 |
15 BrowserCdmCast::~BrowserCdmCast() { | 16 BrowserCdmCast::~BrowserCdmCast() { |
16 player_tracker_.NotifyCdmUnset(); | 17 base::AutoLock auto_lock(callback_lock_); |
| 18 for (std::map<uint32_t, base::Closure>::const_iterator it = |
| 19 cdm_unset_callbacks_.begin(); it != cdm_unset_callbacks_.end(); ++it) { |
| 20 it->second.Run(); |
| 21 } |
17 } | 22 } |
18 | 23 |
19 void BrowserCdmCast::SetCallbacks( | 24 void BrowserCdmCast::SetCallbacks( |
20 const ::media::SessionMessageCB& session_message_cb, | 25 const ::media::SessionMessageCB& session_message_cb, |
21 const ::media::SessionClosedCB& session_closed_cb, | 26 const ::media::SessionClosedCB& session_closed_cb, |
22 const ::media::SessionErrorCB& session_error_cb, | 27 const ::media::SessionErrorCB& session_error_cb, |
23 const ::media::SessionKeysChangeCB& session_keys_change_cb, | 28 const ::media::SessionKeysChangeCB& session_keys_change_cb, |
24 const ::media::SessionExpirationUpdateCB& session_expiration_update_cb) { | 29 const ::media::SessionExpirationUpdateCB& session_expiration_update_cb) { |
25 session_message_cb_ = session_message_cb; | 30 session_message_cb_ = session_message_cb; |
26 session_closed_cb_ = session_closed_cb; | 31 session_closed_cb_ = session_closed_cb; |
27 session_error_cb_ = session_error_cb; | 32 session_error_cb_ = session_error_cb; |
28 session_keys_change_cb_ = session_keys_change_cb; | 33 session_keys_change_cb_ = session_keys_change_cb; |
29 session_expiration_update_cb_ = session_expiration_update_cb; | 34 session_expiration_update_cb_ = session_expiration_update_cb; |
30 } | 35 } |
31 | 36 |
32 int BrowserCdmCast::RegisterPlayer(const base::Closure& new_key_cb, | 37 int BrowserCdmCast::RegisterPlayer(const base::Closure& new_key_cb, |
33 const base::Closure& cdm_unset_cb) { | 38 const base::Closure& cdm_unset_cb) { |
34 return player_tracker_.RegisterPlayer(new_key_cb, cdm_unset_cb); | 39 int registration_id = next_registration_id_++; |
| 40 DCHECK(!new_key_cb.is_null()); |
| 41 DCHECK(!cdm_unset_cb.is_null()); |
| 42 { |
| 43 base::AutoLock auto_lock(callback_lock_); |
| 44 DCHECK(!ContainsKey(new_key_callbacks_, registration_id)); |
| 45 DCHECK(!ContainsKey(cdm_unset_callbacks_, registration_id)); |
| 46 new_key_callbacks_[registration_id] = new_key_cb; |
| 47 cdm_unset_callbacks_[registration_id] = cdm_unset_cb; |
| 48 } |
| 49 return registration_id; |
35 } | 50 } |
36 | 51 |
37 void BrowserCdmCast::UnregisterPlayer(int registration_id) { | 52 void BrowserCdmCast::UnregisterPlayer(int registration_id) { |
38 player_tracker_.UnregisterPlayer(registration_id); | 53 base::AutoLock auto_lock(callback_lock_); |
| 54 DCHECK(ContainsKey(new_key_callbacks_, registration_id)); |
| 55 DCHECK(ContainsKey(cdm_unset_callbacks_, registration_id)); |
| 56 new_key_callbacks_.erase(registration_id); |
| 57 cdm_unset_callbacks_.erase(registration_id); |
39 } | 58 } |
40 | 59 |
41 void BrowserCdmCast::OnSessionMessage(const std::string& web_session_id, | 60 void BrowserCdmCast::OnSessionMessage(const std::string& web_session_id, |
42 const std::vector<uint8>& message, | 61 const std::vector<uint8>& message, |
43 const GURL& destination_url) { | 62 const GURL& destination_url) { |
44 // Note: Message type is not supported in Chromecast. Do our best guess here. | 63 // Note: Message type is not supported in Chromecast. Do our best guess here. |
45 ::media::MediaKeys::MessageType message_type = | 64 ::media::MediaKeys::MessageType message_type = |
46 destination_url.is_empty() ? ::media::MediaKeys::LICENSE_REQUEST | 65 destination_url.is_empty() ? ::media::MediaKeys::LICENSE_REQUEST |
47 : ::media::MediaKeys::LICENSE_RENEWAL; | 66 : ::media::MediaKeys::LICENSE_RENEWAL; |
48 session_message_cb_.Run(web_session_id, | 67 session_message_cb_.Run(web_session_id, |
(...skipping 12 matching lines...) Expand all Loading... |
61 ::media::CdmKeysInfo cdm_keys_info; | 80 ::media::CdmKeysInfo cdm_keys_info; |
62 for (const std::pair<std::string, std::string>& key : keys) { | 81 for (const std::pair<std::string, std::string>& key : keys) { |
63 scoped_ptr< ::media::CdmKeyInformation> cdm_key_information( | 82 scoped_ptr< ::media::CdmKeyInformation> cdm_key_information( |
64 new ::media::CdmKeyInformation()); | 83 new ::media::CdmKeyInformation()); |
65 cdm_key_information->key_id.assign(key.first.begin(), key.first.end()); | 84 cdm_key_information->key_id.assign(key.first.begin(), key.first.end()); |
66 cdm_keys_info.push_back(cdm_key_information.release()); | 85 cdm_keys_info.push_back(cdm_key_information.release()); |
67 } | 86 } |
68 session_keys_change_cb_.Run(web_session_id, true, cdm_keys_info.Pass()); | 87 session_keys_change_cb_.Run(web_session_id, true, cdm_keys_info.Pass()); |
69 | 88 |
70 // Notify listeners of a new key. | 89 // Notify listeners of a new key. |
71 player_tracker_.NotifyNewKey(); | 90 { |
| 91 base::AutoLock auto_lock(callback_lock_); |
| 92 for (std::map<uint32_t, base::Closure>::const_iterator it = |
| 93 new_key_callbacks_.begin(); it != new_key_callbacks_.end(); ++it) { |
| 94 it->second.Run(); |
| 95 } |
| 96 } |
72 } | 97 } |
73 | 98 |
74 } // namespace media | 99 } // namespace media |
75 } // namespace chromecast | 100 } // namespace chromecast |
OLD | NEW |