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