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