cdm_adapter.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
1// Copyright 2013 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_CDM_PPAPI_CDM_ADAPTER_H_
6#define MEDIA_CDM_PPAPI_CDM_ADAPTER_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "build/build_config.h"
14#include "media/cdm/ppapi/api/content_decryption_module.h"
15#include "media/cdm/ppapi/cdm_helpers.h"
16#include "media/cdm/ppapi/cdm_wrapper.h"
17#include "media/cdm/ppapi/linked_ptr.h"
18#include "ppapi/c/pp_stdint.h"
19#include "ppapi/c/private/pp_content_decryptor.h"
20#include "ppapi/cpp/completion_callback.h"
21#include "ppapi/cpp/private/content_decryptor_private.h"
22#include "ppapi/cpp/var.h"
23#include "ppapi/cpp/var_array_buffer.h"
24#include "ppapi/utility/completion_callback_factory.h"
25
26#if defined(OS_CHROMEOS)
27#include "ppapi/cpp/private/output_protection_private.h"
28#include "ppapi/cpp/private/platform_verification.h"
29#endif
30
31namespace media {
32
33// GetCdmHostFunc implementation.
34void* GetCdmHost(int host_interface_version, void* user_data);
35
36// An adapter class for abstracting away PPAPI interaction and threading for a
37// Content Decryption Module (CDM).
38class CdmAdapter : public pp::Instance,
39                   public pp::ContentDecryptor_Private,
40                   public cdm::Host_1,
41                   public cdm::Host_2,
42                   public cdm::Host_4 {
43 public:
44  CdmAdapter(PP_Instance instance, pp::Module* module);
45  virtual ~CdmAdapter();
46
47  // pp::Instance implementation.
48  virtual bool Init(uint32_t argc, const char* argn[], const char* argv[]) {
49    return true;
50  }
51
52  // PPP_ContentDecryptor_Private implementation.
53  // Note: Results of calls to these methods must be reported through the
54  // PPB_ContentDecryptor_Private interface.
55  virtual void Initialize(const std::string& key_system) OVERRIDE;
56  virtual void CreateSession(uint32_t session_id,
57                             const std::string& content_type,
58                             pp::VarArrayBuffer init_data) OVERRIDE;
59  virtual void LoadSession(uint32_t session_id,
60                           const std::string& web_session_id) OVERRIDE;
61  virtual void UpdateSession(uint32_t session_id,
62                             pp::VarArrayBuffer response) OVERRIDE;
63  virtual void ReleaseSession(uint32_t session_id) OVERRIDE;
64  virtual void Decrypt(
65      pp::Buffer_Dev encrypted_buffer,
66      const PP_EncryptedBlockInfo& encrypted_block_info) OVERRIDE;
67  virtual void InitializeAudioDecoder(
68      const PP_AudioDecoderConfig& decoder_config,
69      pp::Buffer_Dev extra_data_buffer) OVERRIDE;
70  virtual void InitializeVideoDecoder(
71      const PP_VideoDecoderConfig& decoder_config,
72      pp::Buffer_Dev extra_data_buffer) OVERRIDE;
73  virtual void DeinitializeDecoder(PP_DecryptorStreamType decoder_type,
74                                   uint32_t request_id) OVERRIDE;
75  virtual void ResetDecoder(PP_DecryptorStreamType decoder_type,
76                            uint32_t request_id) OVERRIDE;
77  virtual void DecryptAndDecode(
78      PP_DecryptorStreamType decoder_type,
79      pp::Buffer_Dev encrypted_buffer,
80      const PP_EncryptedBlockInfo& encrypted_block_info) OVERRIDE;
81
82  // cdm::Host implementation.
83  virtual cdm::Buffer* Allocate(uint32_t capacity) OVERRIDE;
84  virtual void SetTimer(int64_t delay_ms, void* context) OVERRIDE;
85  virtual double GetCurrentWallTimeInSeconds() OVERRIDE;
86  virtual void SendKeyMessage(
87      const char* session_id, uint32_t session_id_length,
88      const char* message, uint32_t message_length,
89      const char* default_url, uint32_t default_url_length) OVERRIDE;
90  virtual void SendKeyError(const char* session_id,
91                            uint32_t session_id_length,
92                            cdm::MediaKeyError error_code,
93                            uint32_t system_code) OVERRIDE;
94  virtual void GetPrivateData(int32_t* instance,
95                              GetPrivateInterface* get_interface) OVERRIDE;
96
97  // cdm::Host_2 implementation.
98  virtual void SendPlatformChallenge(
99      const char* service_id, uint32_t service_id_length,
100      const char* challenge, uint32_t challenge_length) OVERRIDE;
101  virtual void EnableOutputProtection(
102      uint32_t desired_protection_mask) OVERRIDE;
103  virtual void QueryOutputProtectionStatus() OVERRIDE;
104  virtual void OnDeferredInitializationDone(
105      cdm::StreamType stream_type,
106      cdm::Status decoder_status) OVERRIDE;
107
108  // cdm::Host_4 implementation.
109  virtual void OnSessionCreated(uint32_t session_id,
110                                const char* web_session_id,
111                                uint32_t web_session_id_length) OVERRIDE;
112  virtual void OnSessionMessage(uint32_t session_id,
113                                const char* message,
114                                uint32_t message_length,
115                                const char* destination_url,
116                                uint32_t destination_url_length) OVERRIDE;
117  virtual void OnSessionReady(uint32_t session_id) OVERRIDE;
118  virtual void OnSessionClosed(uint32_t session_id) OVERRIDE;
119  virtual void OnSessionError(uint32_t session_id,
120                              cdm::MediaKeyError error_code,
121                              uint32_t system_code) OVERRIDE;
122  virtual cdm::FileIO* CreateFileIO(cdm::FileIOClient* client) OVERRIDE;
123
124 private:
125  typedef linked_ptr<DecryptedBlockImpl> LinkedDecryptedBlock;
126  typedef linked_ptr<VideoFrameImpl> LinkedVideoFrame;
127  typedef linked_ptr<AudioFramesImpl> LinkedAudioFrames;
128
129  bool CreateCdmInstance(const std::string& key_system);
130
131  // <code>PPB_ContentDecryptor_Private</code> dispatchers. These are passed to
132  // <code>callback_factory_</code> to ensure that calls into
133  // <code>PPP_ContentDecryptor_Private</code> are asynchronous.
134  void SendSessionCreatedInternal(int32_t result,
135                                  uint32_t session_id,
136                                  const std::string& web_session_id);
137  void SendSessionMessageInternal(int32_t result,
138                                  uint32_t session_id,
139                                  const std::vector<uint8>& message,
140                                  const std::string& default_url);
141  void SendSessionReadyInternal(int32_t result, uint32_t session_id);
142  void SendSessionClosedInternal(int32_t result, uint32_t session_id);
143  void SendSessionErrorInternal(int32_t result,
144                                uint32_t session_id,
145                                cdm::MediaKeyError error_code,
146                                uint32_t system_code);
147
148  void DeliverBlock(int32_t result,
149                    const cdm::Status& status,
150                    const LinkedDecryptedBlock& decrypted_block,
151                    const PP_DecryptTrackingInfo& tracking_info);
152  void DecoderInitializeDone(int32_t result,
153                             PP_DecryptorStreamType decoder_type,
154                             uint32_t request_id,
155                             bool success);
156  void DecoderDeinitializeDone(int32_t result,
157                               PP_DecryptorStreamType decoder_type,
158                               uint32_t request_id);
159  void DecoderResetDone(int32_t result,
160                        PP_DecryptorStreamType decoder_type,
161                        uint32_t request_id);
162  void DeliverFrame(int32_t result,
163                    const cdm::Status& status,
164                    const LinkedVideoFrame& video_frame,
165                    const PP_DecryptTrackingInfo& tracking_info);
166  void DeliverSamples(int32_t result,
167                      const cdm::Status& status,
168                      const LinkedAudioFrames& audio_frames,
169                      const PP_DecryptTrackingInfo& tracking_info);
170
171  // Helper for SetTimer().
172  void TimerExpired(int32_t result, void* context);
173
174  bool IsValidVideoFrame(const LinkedVideoFrame& video_frame);
175
176#if !defined(NDEBUG)
177  // Logs the given message to the JavaScript console associated with the
178  // CDM adapter instance. The name of the CDM adapter issuing the log message
179  // will be automatically prepended to the message.
180  void LogToConsole(const pp::Var& value);
181#endif  // !defined(NDEBUG)
182
183#if defined(OS_CHROMEOS)
184  void SendPlatformChallengeDone(int32_t result);
185  void EnableProtectionDone(int32_t result);
186  void QueryOutputProtectionStatusDone(int32_t result);
187
188  pp::OutputProtection_Private output_protection_;
189  pp::PlatformVerification platform_verification_;
190
191  // Since PPAPI doesn't provide handlers for CompletionCallbacks with more than
192  // one output we need to manage our own.  These values are only read by
193  // SendPlatformChallengeDone().
194  pp::Var signed_data_output_;
195  pp::Var signed_data_signature_output_;
196  pp::Var platform_key_certificate_output_;
197  bool challenge_in_progress_;
198
199  // Same as above, these are only read by QueryOutputProtectionStatusDone().
200  uint32_t output_link_mask_;
201  uint32_t output_protection_mask_;
202  bool query_output_protection_in_progress_;
203#endif
204
205  PpbBufferAllocator allocator_;
206  pp::CompletionCallbackFactory<CdmAdapter> callback_factory_;
207  linked_ptr<CdmWrapper> cdm_;
208  std::string key_system_;
209
210  // If the CDM returned kDeferredInitialization during InitializeAudioDecoder()
211  // or InitializeVideoDecoder(), the (Audio|Video)DecoderConfig.request_id is
212  // saved for the future call to OnDeferredInitializationDone().
213  bool deferred_initialize_audio_decoder_;
214  uint32_t deferred_audio_decoder_config_id_;
215  bool deferred_initialize_video_decoder_;
216  uint32_t deferred_video_decoder_config_id_;
217
218  DISALLOW_COPY_AND_ASSIGN(CdmAdapter);
219};
220
221}  // namespace media
222
223#endif  // MEDIA_CDM_PPAPI_CDM_ADAPTER_H_
224