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 "content/renderer/pepper/content_decryptor_delegate.h" | 5 #include "content/renderer/pepper/content_decryptor_delegate.h" |
| 6 | 6 |
| 7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
| 8 #include "base/debug/trace_event.h" | 8 #include "base/debug/trace_event.h" |
| 9 #include "base/message_loop/message_loop_proxy.h" | 9 #include "base/message_loop/message_loop_proxy.h" |
| 10 #include "base/metrics/sparse_histogram.h" | |
| 10 #include "base/numerics/safe_conversions.h" | 11 #include "base/numerics/safe_conversions.h" |
| 12 #include "content/renderer/media/crypto/key_systems.h" | |
|
ddorwin
2014/09/10 21:24:34
Is this allowed? crypto/ is not in src/content/ren
xhwang
2014/09/10 22:09:33
It seems this IS allowed.
| |
| 11 #include "content/renderer/pepper/ppb_buffer_impl.h" | 13 #include "content/renderer/pepper/ppb_buffer_impl.h" |
| 12 #include "media/base/audio_buffer.h" | 14 #include "media/base/audio_buffer.h" |
| 13 #include "media/base/audio_decoder_config.h" | 15 #include "media/base/audio_decoder_config.h" |
| 14 #include "media/base/bind_to_current_loop.h" | 16 #include "media/base/bind_to_current_loop.h" |
| 15 #include "media/base/cdm_promise.h" | 17 #include "media/base/cdm_promise.h" |
| 16 #include "media/base/channel_layout.h" | 18 #include "media/base/channel_layout.h" |
| 17 #include "media/base/data_buffer.h" | 19 #include "media/base/data_buffer.h" |
| 18 #include "media/base/decoder_buffer.h" | 20 #include "media/base/decoder_buffer.h" |
| 19 #include "media/base/decrypt_config.h" | 21 #include "media/base/decrypt_config.h" |
| 20 #include "media/base/limits.h" | 22 #include "media/base/limits.h" |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 87 return false; | 89 return false; |
| 88 | 90 |
| 89 memcpy(array, str.data(), str.size()); | 91 memcpy(array, str.data(), str.size()); |
| 90 return true; | 92 return true; |
| 91 } | 93 } |
| 92 | 94 |
| 93 // Fills the |block_info| with information from |encrypted_buffer|. | 95 // Fills the |block_info| with information from |encrypted_buffer|. |
| 94 // | 96 // |
| 95 // Returns true if |block_info| is successfully filled. Returns false | 97 // Returns true if |block_info| is successfully filled. Returns false |
| 96 // otherwise. | 98 // otherwise. |
| 97 static bool MakeEncryptedBlockInfo( | 99 bool MakeEncryptedBlockInfo( |
| 98 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, | 100 const scoped_refptr<media::DecoderBuffer>& encrypted_buffer, |
| 99 uint32_t request_id, | 101 uint32_t request_id, |
| 100 PP_EncryptedBlockInfo* block_info) { | 102 PP_EncryptedBlockInfo* block_info) { |
| 101 // TODO(xhwang): Fix initialization of PP_EncryptedBlockInfo here and | 103 // TODO(xhwang): Fix initialization of PP_EncryptedBlockInfo here and |
| 102 // anywhere else. | 104 // anywhere else. |
| 103 memset(block_info, 0, sizeof(*block_info)); | 105 memset(block_info, 0, sizeof(*block_info)); |
| 104 block_info->tracking_info.request_id = request_id; | 106 block_info->tracking_info.request_id = request_id; |
| 105 | 107 |
| 106 // EOS buffers need a request ID and nothing more. | 108 // EOS buffers need a request ID and nothing more. |
| 107 if (encrypted_buffer->end_of_stream()) | 109 if (encrypted_buffer->end_of_stream()) |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 281 case PP_CDMEXCEPTIONCODE_CLIENTERROR: | 283 case PP_CDMEXCEPTIONCODE_CLIENTERROR: |
| 282 return MediaKeys::CLIENT_ERROR; | 284 return MediaKeys::CLIENT_ERROR; |
| 283 case PP_CDMEXCEPTIONCODE_OUTPUTERROR: | 285 case PP_CDMEXCEPTIONCODE_OUTPUTERROR: |
| 284 return MediaKeys::OUTPUT_ERROR; | 286 return MediaKeys::OUTPUT_ERROR; |
| 285 default: | 287 default: |
| 286 NOTREACHED(); | 288 NOTREACHED(); |
| 287 return MediaKeys::UNKNOWN_ERROR; | 289 return MediaKeys::UNKNOWN_ERROR; |
| 288 } | 290 } |
| 289 } | 291 } |
| 290 | 292 |
| 293 void ReportSystemCodeUMA(const std::string& key_system, uint32 system_code) { | |
| 294 // Sparse histogram macro does not cache the histogram, so it's safe to use | |
| 295 // macro with non-static histogram name here. | |
| 296 UMA_HISTOGRAM_SPARSE_SLOWLY( | |
| 297 "Media.EME." + KeySystemNameForUMA(key_system) + ".SystemCode", | |
| 298 system_code); | |
| 299 } | |
| 300 | |
| 291 } // namespace | 301 } // namespace |
| 292 | 302 |
| 293 ContentDecryptorDelegate::ContentDecryptorDelegate( | 303 ContentDecryptorDelegate::ContentDecryptorDelegate( |
| 294 PP_Instance pp_instance, | 304 PP_Instance pp_instance, |
| 295 const PPP_ContentDecryptor_Private* plugin_decryption_interface) | 305 const PPP_ContentDecryptor_Private* plugin_decryption_interface) |
| 296 : pp_instance_(pp_instance), | 306 : pp_instance_(pp_instance), |
| 297 plugin_decryption_interface_(plugin_decryption_interface), | 307 plugin_decryption_interface_(plugin_decryption_interface), |
| 298 next_decryption_request_id_(1), | 308 next_decryption_request_id_(1), |
| 299 audio_samples_per_second_(0), | 309 audio_samples_per_second_(0), |
| 300 audio_channel_count_(0), | 310 audio_channel_count_(0), |
| (...skipping 459 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 760 | 770 |
| 761 KeyIdsPromise* key_ids_promise(static_cast<KeyIdsPromise*>(promise.get())); | 771 KeyIdsPromise* key_ids_promise(static_cast<KeyIdsPromise*>(promise.get())); |
| 762 key_ids_promise->resolve(key_ids_vector); | 772 key_ids_promise->resolve(key_ids_vector); |
| 763 } | 773 } |
| 764 | 774 |
| 765 void ContentDecryptorDelegate::OnPromiseRejected( | 775 void ContentDecryptorDelegate::OnPromiseRejected( |
| 766 uint32 promise_id, | 776 uint32 promise_id, |
| 767 PP_CdmExceptionCode exception_code, | 777 PP_CdmExceptionCode exception_code, |
| 768 uint32 system_code, | 778 uint32 system_code, |
| 769 PP_Var error_description) { | 779 PP_Var error_description) { |
| 780 ReportSystemCodeUMA(key_system_, system_code); | |
| 781 | |
| 770 StringVar* error_description_string = StringVar::FromPPVar(error_description); | 782 StringVar* error_description_string = StringVar::FromPPVar(error_description); |
| 771 DCHECK(error_description_string); | 783 DCHECK(error_description_string); |
| 772 | 784 |
| 773 scoped_ptr<CdmPromise> promise = TakePromise(promise_id); | 785 scoped_ptr<CdmPromise> promise = TakePromise(promise_id); |
| 774 DCHECK(promise); | 786 DCHECK(promise); |
| 775 if (promise) { | 787 if (promise) { |
| 776 promise->reject(PpExceptionTypeToMediaException(exception_code), | 788 promise->reject(PpExceptionTypeToMediaException(exception_code), |
| 777 system_code, | 789 system_code, |
| 778 error_description_string->value()); | 790 error_description_string->value()); |
| 779 } | 791 } |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 839 DCHECK(web_session_id_string); | 851 DCHECK(web_session_id_string); |
| 840 | 852 |
| 841 session_closed_cb_.Run(web_session_id_string->value()); | 853 session_closed_cb_.Run(web_session_id_string->value()); |
| 842 } | 854 } |
| 843 | 855 |
| 844 void ContentDecryptorDelegate::OnSessionError( | 856 void ContentDecryptorDelegate::OnSessionError( |
| 845 PP_Var web_session_id, | 857 PP_Var web_session_id, |
| 846 PP_CdmExceptionCode exception_code, | 858 PP_CdmExceptionCode exception_code, |
| 847 uint32 system_code, | 859 uint32 system_code, |
| 848 PP_Var error_description) { | 860 PP_Var error_description) { |
| 861 ReportSystemCodeUMA(key_system_, system_code); | |
| 862 | |
| 849 if (session_error_cb_.is_null()) | 863 if (session_error_cb_.is_null()) |
| 850 return; | 864 return; |
| 851 | 865 |
| 852 StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id); | 866 StringVar* web_session_id_string = StringVar::FromPPVar(web_session_id); |
| 853 DCHECK(web_session_id_string); | 867 DCHECK(web_session_id_string); |
| 854 | 868 |
| 855 StringVar* error_description_string = StringVar::FromPPVar(error_description); | 869 StringVar* error_description_string = StringVar::FromPPVar(error_description); |
| 856 DCHECK(error_description_string); | 870 DCHECK(error_description_string); |
| 857 | 871 |
| 858 session_error_cb_.Run(web_session_id_string->value(), | 872 session_error_cb_.Run(web_session_id_string->value(), |
| (...skipping 443 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1302 | 1316 |
| 1303 scoped_ptr<CdmPromise> ContentDecryptorDelegate::TakePromise( | 1317 scoped_ptr<CdmPromise> ContentDecryptorDelegate::TakePromise( |
| 1304 uint32_t promise_id) { | 1318 uint32_t promise_id) { |
| 1305 PromiseMap::iterator it = promises_.find(promise_id); | 1319 PromiseMap::iterator it = promises_.find(promise_id); |
| 1306 if (it == promises_.end()) | 1320 if (it == promises_.end()) |
| 1307 return scoped_ptr<CdmPromise>(); | 1321 return scoped_ptr<CdmPromise>(); |
| 1308 return promises_.take_and_erase(it); | 1322 return promises_.take_and_erase(it); |
| 1309 } | 1323 } |
| 1310 | 1324 |
| 1311 } // namespace content | 1325 } // namespace content |
| OLD | NEW |