Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / media / cdm / ppapi / cdm_adapter.h
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
31 namespace media {
32
33 // GetCdmHostFunc implementation.
34 void* 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).
38 class 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_