1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#ifndef CONTENT_RENDERER_MEDIA_CRYPTO_PPAPI_DECRYPTOR_H_
6a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#define CONTENT_RENDERER_MEDIA_CRYPTO_PPAPI_DECRYPTOR_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
11eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/basictypes.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/ref_counted.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/crypto/pepper_cdm_wrapper.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/decryptor.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/base/media_keys.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_decoder_config.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
190529e5d033099cbfc42635f6f6183833b09dff6eBen Murdochclass GURL;
200529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MessageLoopProxy;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25a3f7b4e666c476898878fa745f637129375cd889Ben Murdochnamespace content {
2658e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochclass ContentDecryptorDelegate;
2758e6fbe4ee35d65e14b626c557d37565bf8ad179Ben Murdochclass PepperPluginInstanceImpl;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
29a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// PpapiDecryptor implements media::MediaKeys and media::Decryptor and forwards
30a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// all calls to the PluginInstance.
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class should always be created & destroyed on the main renderer thread.
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class PpapiDecryptor : public media::MediaKeys, public media::Decryptor {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
34a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch  static scoped_ptr<PpapiDecryptor> Create(
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const std::string& key_system,
360529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch      const GURL& security_origin,
37a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const CreatePepperCdmCB& create_pepper_cdm_cb,
38a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const media::SessionMessageCB& session_message_cb,
39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const media::SessionReadyCB& session_ready_cb,
40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)      const media::SessionClosedCB& session_closed_cb,
41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      const media::SessionErrorCB& session_error_cb);
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PpapiDecryptor();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // media::MediaKeys implementation.
46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void CreateSession(
47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& init_data_type,
48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const uint8* init_data,
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      int init_data_length,
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      SessionType session_type,
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<media::NewSessionCdmPromise> promise) OVERRIDE;
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void LoadSession(
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& web_session_id,
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<media::NewSessionCdmPromise> promise) OVERRIDE;
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void UpdateSession(
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& web_session_id,
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const uint8* response,
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      int response_length,
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<media::SimpleCdmPromise> promise) OVERRIDE;
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void ReleaseSession(
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      const std::string& web_session_id,
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      scoped_ptr<media::SimpleCdmPromise> promise) OVERRIDE;
63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual Decryptor* GetDecryptor() OVERRIDE;
64868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
65868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // media::Decryptor implementation.
662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RegisterNewKeyCB(StreamType stream_type,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                const NewKeyCB& key_added_cb) OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void Decrypt(StreamType stream_type,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const scoped_refptr<media::DecoderBuffer>& encrypted,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       const DecryptCB& decrypt_cb) OVERRIDE;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CancelDecrypt(StreamType stream_type) OVERRIDE;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitializeAudioDecoder(const media::AudioDecoderConfig& config,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const DecoderInitCB& init_cb) OVERRIDE;
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void InitializeVideoDecoder(const media::VideoDecoderConfig& config,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      const DecoderInitCB& init_cb) OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DecryptAndDecodeAudio(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const scoped_refptr<media::DecoderBuffer>& encrypted,
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const AudioDecodeCB& audio_decode_cb) OVERRIDE;
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DecryptAndDecodeVideo(
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const scoped_refptr<media::DecoderBuffer>& encrypted,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const VideoDecodeCB& video_decode_cb) OVERRIDE;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ResetDecoder(StreamType stream_type) OVERRIDE;
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DeinitializeDecoder(StreamType stream_type) OVERRIDE;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  PpapiDecryptor(const std::string& key_system,
87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 scoped_ptr<PepperCdmWrapper> pepper_cdm_wrapper,
88a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 const media::SessionMessageCB& session_message_cb,
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 const media::SessionReadyCB& session_ready_cb,
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                 const media::SessionClosedCB& session_closed_cb,
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                 const media::SessionErrorCB& session_error_cb);
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnDecoderInitialized(StreamType stream_type, bool success);
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Callbacks for |plugin_cdm_delegate_| to fire session events.
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSessionMessage(const std::string& web_session_id,
97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                        const std::vector<uint8>& message,
98cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                        const GURL& destination_url);
99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSessionReady(const std::string& web_session_id);
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSessionClosed(const std::string& web_session_id);
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void OnSessionError(const std::string& web_session_id,
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      MediaKeys::Exception exception_code,
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      uint32 system_code,
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                      const std::string& error_description);
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // On a successful Update() or SessionReady event, trigger playback to resume.
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void ResumePlayback();
108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Callback to notify that a fatal error happened in |plugin_cdm_delegate_|.
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The error is terminal and |plugin_cdm_delegate_| should not be used after
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // this call.
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void OnFatalPluginError();
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  ContentDecryptorDelegate* CdmDelegate();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
116a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // Hold a reference of the Pepper CDM wrapper to make sure the plugin lives
117a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  // as long as needed.
118a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<PepperCdmWrapper> pepper_cdm_wrapper_;
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Callbacks for firing session events.
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  media::SessionMessageCB session_message_cb_;
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  media::SessionReadyCB session_ready_cb_;
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  media::SessionClosedCB session_closed_cb_;
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  media::SessionErrorCB session_error_cb_;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<base::MessageLoopProxy> render_loop_proxy_;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecoderInitCB audio_decoder_init_cb_;
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DecoderInitCB video_decoder_init_cb_;
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NewKeyCB new_audio_key_cb_;
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  NewKeyCB new_video_key_cb_;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // NOTE: Weak pointers must be invalidated before all other member variables.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<PpapiDecryptor> weak_ptr_factory_;
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PpapiDecryptor);
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
139a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch}  // namespace content
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
141a3f7b4e666c476898878fa745f637129375cd889Ben Murdoch#endif  // CONTENT_RENDERER_MEDIA_CRYPTO_PPAPI_DECRYPTOR_H_
142