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