1 // Copyright 2019 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef MEDIA_FUCHSIA_CDM_FUCHSIA_CDM_H_ 6 #define MEDIA_FUCHSIA_CDM_FUCHSIA_CDM_H_ 7 8 #include <fuchsia/media/drm/cpp/fidl.h> 9 10 #include "base/callback_forward.h" 11 #include "base/containers/flat_map.h" 12 #include "base/macros.h" 13 #include "base/optional.h" 14 #include "media/base/callback_registry.h" 15 #include "media/base/cdm_context.h" 16 #include "media/base/cdm_promise_adapter.h" 17 #include "media/base/content_decryption_module.h" 18 #include "media/fuchsia/cdm/fuchsia_cdm_context.h" 19 #include "media/fuchsia/cdm/fuchsia_decryptor.h" 20 21 namespace media { 22 23 class FuchsiaCdm : public ContentDecryptionModule, 24 public CdmContext, 25 public FuchsiaCdmContext { 26 public: 27 struct SessionCallbacks { 28 SessionCallbacks(); 29 SessionCallbacks(SessionCallbacks&&); 30 ~SessionCallbacks(); 31 32 SessionCallbacks& operator=(SessionCallbacks&&); 33 34 SessionMessageCB message_cb; 35 SessionClosedCB closed_cb; 36 SessionKeysChangeCB keys_change_cb; 37 SessionExpirationUpdateCB expiration_update_cb; 38 39 DISALLOW_COPY_AND_ASSIGN(SessionCallbacks); 40 }; 41 using ReadyCB = base::OnceCallback<void(bool, const std::string&)>; 42 43 FuchsiaCdm(fuchsia::media::drm::ContentDecryptionModulePtr cdm, 44 ReadyCB ready_cb, 45 SessionCallbacks callbacks); 46 47 // ContentDecryptionModule implementation: 48 void SetServerCertificate(const std::vector<uint8_t>& certificate, 49 std::unique_ptr<SimpleCdmPromise> promise) override; 50 void CreateSessionAndGenerateRequest( 51 CdmSessionType session_type, 52 EmeInitDataType init_data_type, 53 const std::vector<uint8_t>& init_data, 54 std::unique_ptr<NewSessionCdmPromise> promise) override; 55 void LoadSession(CdmSessionType session_type, 56 const std::string& session_id, 57 std::unique_ptr<NewSessionCdmPromise> promise) override; 58 void UpdateSession(const std::string& session_id, 59 const std::vector<uint8_t>& response, 60 std::unique_ptr<SimpleCdmPromise> promise) override; 61 void CloseSession(const std::string& session_id, 62 std::unique_ptr<SimpleCdmPromise> promise) override; 63 void RemoveSession(const std::string& session_id, 64 std::unique_ptr<SimpleCdmPromise> promise) override; 65 CdmContext* GetCdmContext() override; 66 67 // CdmContext implementation: 68 std::unique_ptr<CallbackRegistration> RegisterEventCB( 69 EventCB event_cb) override; 70 Decryptor* GetDecryptor() override; 71 FuchsiaCdmContext* GetFuchsiaCdmContext() override; 72 73 // FuchsiaCdmContext implementation: 74 std::unique_ptr<FuchsiaSecureStreamDecryptor> CreateVideoDecryptor( 75 FuchsiaSecureStreamDecryptor::Client* client) override; 76 std::unique_ptr<FuchsiaClearStreamDecryptor> CreateAudioDecryptor() override; 77 78 private: 79 class CdmSession; 80 81 ~FuchsiaCdm() override; 82 83 void OnProvisioned(); 84 void OnCreateSession(std::unique_ptr<CdmSession> session, 85 uint32_t promise_id, 86 const std::string& session_id); 87 void OnGenerateLicenseRequestStatus( 88 CdmSession* session, 89 uint32_t promise_id, 90 base::Optional<CdmPromise::Exception> exception); 91 void OnProcessLicenseServerMessageStatus( 92 uint32_t promise_id, 93 base::Optional<CdmPromise::Exception> exception); 94 95 void OnNewKey(); 96 97 CdmPromiseAdapter promises_; 98 base::flat_map<std::string, std::unique_ptr<CdmSession>> session_map_; 99 100 fuchsia::media::drm::ContentDecryptionModulePtr cdm_; 101 ReadyCB ready_cb_; 102 SessionCallbacks session_callbacks_; 103 104 FuchsiaDecryptor decryptor_; 105 106 base::Lock new_key_cb_for_video_lock_; 107 base::RepeatingClosure new_key_cb_for_video_ 108 GUARDED_BY(new_key_cb_for_video_lock_); 109 110 CallbackRegistry<EventCB::RunType> event_callbacks_; 111 112 DISALLOW_COPY_AND_ASSIGN(FuchsiaCdm); 113 }; 114 115 } // namespace media 116 117 #endif // MEDIA_FUCHSIA_CDM_FUCHSIA_CDM_H_ 118