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/containers/flat_map.h" 11 #include "base/macros.h" 12 #include "base/optional.h" 13 #include "media/base/cdm_context.h" 14 #include "media/base/cdm_promise_adapter.h" 15 #include "media/base/content_decryption_module.h" 16 #include "media/fuchsia/cdm/fuchsia_cdm_context.h" 17 #include "media/fuchsia/cdm/fuchsia_decryptor.h" 18 19 namespace media { 20 21 class FuchsiaCdm : public ContentDecryptionModule, 22 public CdmContext, 23 public FuchsiaCdmContext { 24 public: 25 struct SessionCallbacks { 26 SessionCallbacks(); 27 SessionCallbacks(SessionCallbacks&&); 28 ~SessionCallbacks(); 29 30 SessionCallbacks& operator=(SessionCallbacks&&); 31 32 SessionMessageCB message_cb; 33 SessionClosedCB closed_cb; 34 SessionKeysChangeCB keys_change_cb; 35 SessionExpirationUpdateCB expiration_update_cb; 36 37 DISALLOW_COPY_AND_ASSIGN(SessionCallbacks); 38 }; 39 40 FuchsiaCdm(fuchsia::media::drm::ContentDecryptionModulePtr cdm, 41 SessionCallbacks callbacks); 42 43 // ContentDecryptionModule implementation: 44 void SetServerCertificate(const std::vector<uint8_t>& certificate, 45 std::unique_ptr<SimpleCdmPromise> promise) override; 46 void CreateSessionAndGenerateRequest( 47 CdmSessionType session_type, 48 EmeInitDataType init_data_type, 49 const std::vector<uint8_t>& init_data, 50 std::unique_ptr<NewSessionCdmPromise> promise) override; 51 void LoadSession(CdmSessionType session_type, 52 const std::string& session_id, 53 std::unique_ptr<NewSessionCdmPromise> promise) override; 54 void UpdateSession(const std::string& session_id, 55 const std::vector<uint8_t>& response, 56 std::unique_ptr<SimpleCdmPromise> promise) override; 57 void CloseSession(const std::string& session_id, 58 std::unique_ptr<SimpleCdmPromise> promise) override; 59 void RemoveSession(const std::string& session_id, 60 std::unique_ptr<SimpleCdmPromise> promise) override; 61 CdmContext* GetCdmContext() override; 62 63 // CdmContext implementation: 64 std::unique_ptr<CallbackRegistration> RegisterEventCB( 65 EventCB event_cb) override; 66 Decryptor* GetDecryptor() override; 67 int GetCdmId() const override; 68 FuchsiaCdmContext* GetFuchsiaCdmContext() override; 69 70 // FuchsiaCdmContext implementation: 71 std::unique_ptr<FuchsiaSecureStreamDecryptor> CreateVideoDecryptor( 72 FuchsiaSecureStreamDecryptor::Client* client) override; 73 74 private: 75 class CdmSession; 76 77 ~FuchsiaCdm() override; 78 79 void OnCreateSession(std::unique_ptr<CdmSession> session, 80 uint32_t promise_id, 81 const std::string& session_id); 82 void OnGenerateLicenseRequestStatus( 83 CdmSession* session, 84 uint32_t promise_id, 85 base::Optional<CdmPromise::Exception> exception); 86 void OnProcessLicenseServerMessageStatus( 87 uint32_t promise_id, 88 base::Optional<CdmPromise::Exception> exception); 89 90 void OnNewKey(); 91 92 CdmPromiseAdapter promises_; 93 base::flat_map<std::string, std::unique_ptr<CdmSession>> session_map_; 94 95 fuchsia::media::drm::ContentDecryptionModulePtr cdm_; 96 SessionCallbacks session_callbacks_; 97 98 FuchsiaDecryptor decryptor_; 99 100 base::Lock new_key_cb_for_video_lock_; 101 base::RepeatingClosure new_key_cb_for_video_ 102 GUARDED_BY(new_key_cb_for_video_lock_); 103 104 DISALLOW_COPY_AND_ASSIGN(FuchsiaCdm); 105 }; 106 107 } // namespace media 108 109 #endif // MEDIA_FUCHSIA_CDM_FUCHSIA_CDM_H_ 110