// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef WEBKIT_MEDIA_CRYPTO_PROXY_DECRYPTOR_H_ #define WEBKIT_MEDIA_CRYPTO_PROXY_DECRYPTOR_H_ #include #include #include "base/memory/scoped_ptr.h" #include "base/synchronization/lock.h" #include "media/base/decryptor.h" namespace base { class MessageLoopProxy; } namespace media { class DecryptorClient; } namespace WebKit { class WebFrame; class WebMediaPlayerClient; } namespace webkit_media { // A decryptor proxy that creates a real decryptor object on demand and // forwards decryptor calls to it. // TODO(xhwang): Currently we don't support run-time switching among decryptor // objects. Fix this when needed. class ProxyDecryptor : public media::Decryptor { public: ProxyDecryptor(media::DecryptorClient* decryptor_client, WebKit::WebMediaPlayerClient* web_media_player_client, WebKit::WebFrame* web_frame); virtual ~ProxyDecryptor(); void set_decryptor_for_testing(scoped_ptr decryptor) { decryptor_ = decryptor.Pass(); } // media::Decryptor implementation. virtual bool GenerateKeyRequest(const std::string& key_system, const uint8* init_data, int init_data_length) OVERRIDE; virtual void AddKey(const std::string& key_system, const uint8* key, int key_length, const uint8* init_data, int init_data_length, const std::string& session_id) OVERRIDE; virtual void CancelKeyRequest(const std::string& key_system, const std::string& session_id) OVERRIDE; virtual void Decrypt(const scoped_refptr& encrypted, const DecryptCB& decrypt_cb) OVERRIDE; virtual void Stop() OVERRIDE; private: scoped_ptr CreatePpapiDecryptor( const std::string& key_system); scoped_ptr CreateDecryptor(const std::string& key_system); // Helper function that makes sure decryptor_->Decrypt() runs on the // |message_loop|. void DecryptOnMessageLoop( const scoped_refptr& message_loop_proxy, const scoped_refptr& encrypted, const media::Decryptor::DecryptCB& decrypt_cb); // Callback used to pass into decryptor_->Decrypt(). void OnBufferDecrypted( const scoped_refptr& message_loop_proxy, const scoped_refptr& encrypted, const media::Decryptor::DecryptCB& decrypt_cb, media::Decryptor::Status status, const scoped_refptr& decrypted); media::DecryptorClient* client_; // Needed to create the PpapiDecryptor. WebKit::WebMediaPlayerClient* web_media_player_client_; WebKit::WebFrame* web_frame_; // Protects the |decryptor_| and |pending_decrypt_closures_|. Note that // |decryptor_| itself should be thread safe as per the Decryptor interface. base::Lock lock_; scoped_ptr decryptor_; std::vector pending_decrypt_closures_; bool stopped_; DISALLOW_COPY_AND_ASSIGN(ProxyDecryptor); }; } // namespace webkit_media #endif // WEBKIT_MEDIA_CRYPTO_PROXY_DECRYPTOR_H_