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 CONTENT_RENDERER_MEDIA_CRYPTO_PPAPI_DECRYPTOR_H_
6#define CONTENT_RENDERER_MEDIA_CRYPTO_PPAPI_DECRYPTOR_H_
7
8#include <string>
9#include <vector>
10
11#include "base/basictypes.h"
12#include "base/memory/ref_counted.h"
13#include "base/memory/weak_ptr.h"
14#include "content/renderer/media/crypto/pepper_cdm_wrapper.h"
15#include "media/base/decryptor.h"
16#include "media/base/media_keys.h"
17#include "media/base/video_decoder_config.h"
18
19class GURL;
20
21namespace base {
22class MessageLoopProxy;
23}
24
25namespace content {
26class ContentDecryptorDelegate;
27class PepperPluginInstanceImpl;
28
29// PpapiDecryptor implements media::MediaKeys and media::Decryptor and forwards
30// all calls to the PluginInstance.
31// This class should always be created & destroyed on the main renderer thread.
32class PpapiDecryptor : public media::MediaKeys, public media::Decryptor {
33 public:
34  static scoped_ptr<PpapiDecryptor> Create(
35      const std::string& key_system,
36      const GURL& security_origin,
37      const CreatePepperCdmCB& create_pepper_cdm_cb,
38      const media::SessionMessageCB& session_message_cb,
39      const media::SessionReadyCB& session_ready_cb,
40      const media::SessionClosedCB& session_closed_cb,
41      const media::SessionErrorCB& session_error_cb);
42
43  virtual ~PpapiDecryptor();
44
45  // media::MediaKeys implementation.
46  virtual void CreateSession(
47      const std::string& init_data_type,
48      const uint8* init_data,
49      int init_data_length,
50      SessionType session_type,
51      scoped_ptr<media::NewSessionCdmPromise> promise) OVERRIDE;
52  virtual void LoadSession(
53      const std::string& web_session_id,
54      scoped_ptr<media::NewSessionCdmPromise> promise) OVERRIDE;
55  virtual void UpdateSession(
56      const std::string& web_session_id,
57      const uint8* response,
58      int response_length,
59      scoped_ptr<media::SimpleCdmPromise> promise) OVERRIDE;
60  virtual void ReleaseSession(
61      const std::string& web_session_id,
62      scoped_ptr<media::SimpleCdmPromise> promise) OVERRIDE;
63  virtual Decryptor* GetDecryptor() OVERRIDE;
64
65  // media::Decryptor implementation.
66  virtual void RegisterNewKeyCB(StreamType stream_type,
67                                const NewKeyCB& key_added_cb) OVERRIDE;
68  virtual void Decrypt(StreamType stream_type,
69                       const scoped_refptr<media::DecoderBuffer>& encrypted,
70                       const DecryptCB& decrypt_cb) OVERRIDE;
71  virtual void CancelDecrypt(StreamType stream_type) OVERRIDE;
72  virtual void InitializeAudioDecoder(const media::AudioDecoderConfig& config,
73                                      const DecoderInitCB& init_cb) OVERRIDE;
74  virtual void InitializeVideoDecoder(const media::VideoDecoderConfig& config,
75                                      const DecoderInitCB& init_cb) OVERRIDE;
76  virtual void DecryptAndDecodeAudio(
77      const scoped_refptr<media::DecoderBuffer>& encrypted,
78      const AudioDecodeCB& audio_decode_cb) OVERRIDE;
79  virtual void DecryptAndDecodeVideo(
80      const scoped_refptr<media::DecoderBuffer>& encrypted,
81      const VideoDecodeCB& video_decode_cb) OVERRIDE;
82  virtual void ResetDecoder(StreamType stream_type) OVERRIDE;
83  virtual void DeinitializeDecoder(StreamType stream_type) OVERRIDE;
84
85 private:
86  PpapiDecryptor(const std::string& key_system,
87                 scoped_ptr<PepperCdmWrapper> pepper_cdm_wrapper,
88                 const media::SessionMessageCB& session_message_cb,
89                 const media::SessionReadyCB& session_ready_cb,
90                 const media::SessionClosedCB& session_closed_cb,
91                 const media::SessionErrorCB& session_error_cb);
92
93  void OnDecoderInitialized(StreamType stream_type, bool success);
94
95  // Callbacks for |plugin_cdm_delegate_| to fire session events.
96  void OnSessionMessage(const std::string& web_session_id,
97                        const std::vector<uint8>& message,
98                        const GURL& destination_url);
99  void OnSessionReady(const std::string& web_session_id);
100  void OnSessionClosed(const std::string& web_session_id);
101  void OnSessionError(const std::string& web_session_id,
102                      MediaKeys::Exception exception_code,
103                      uint32 system_code,
104                      const std::string& error_description);
105
106  // On a successful Update() or SessionReady event, trigger playback to resume.
107  void ResumePlayback();
108
109  // Callback to notify that a fatal error happened in |plugin_cdm_delegate_|.
110  // The error is terminal and |plugin_cdm_delegate_| should not be used after
111  // this call.
112  void OnFatalPluginError();
113
114  ContentDecryptorDelegate* CdmDelegate();
115
116  // Hold a reference of the Pepper CDM wrapper to make sure the plugin lives
117  // as long as needed.
118  scoped_ptr<PepperCdmWrapper> pepper_cdm_wrapper_;
119
120  // Callbacks for firing session events.
121  media::SessionMessageCB session_message_cb_;
122  media::SessionReadyCB session_ready_cb_;
123  media::SessionClosedCB session_closed_cb_;
124  media::SessionErrorCB session_error_cb_;
125
126  scoped_refptr<base::MessageLoopProxy> render_loop_proxy_;
127
128  DecoderInitCB audio_decoder_init_cb_;
129  DecoderInitCB video_decoder_init_cb_;
130  NewKeyCB new_audio_key_cb_;
131  NewKeyCB new_video_key_cb_;
132
133  // NOTE: Weak pointers must be invalidated before all other member variables.
134  base::WeakPtrFactory<PpapiDecryptor> weak_ptr_factory_;
135
136  DISALLOW_COPY_AND_ASSIGN(PpapiDecryptor);
137};
138
139}  // namespace content
140
141#endif  // CONTENT_RENDERER_MEDIA_CRYPTO_PPAPI_DECRYPTOR_H_
142