media_drm_bridge.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
17d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file. 47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef MEDIA_BASE_ANDROID_MEDIA_DRM_BRIDGE_H_ 67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define MEDIA_BASE_ANDROID_MEDIA_DRM_BRIDGE_H_ 77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <jni.h> 97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <string> 107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include <vector> 117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/android/scoped_java_ref.h" 13424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "base/callback.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/memory/scoped_ptr.h" 157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "media/base/media_export.h" 167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "media/base/media_keys.h" 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "url/gurl.h" 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class GURL; 207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace media { 227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MediaPlayerManager; 24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// This class provides DRM services for android EME implementation. 267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(qinmin): implement all the functions in this class. 277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class MEDIA_EXPORT MediaDrmBridge : public MediaKeys { 287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public: 29424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) enum SecurityLevel { 30424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECURITY_LEVEL_NONE = 0, 31424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECURITY_LEVEL_1 = 1, 32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SECURITY_LEVEL_3 = 3, 33424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) }; 34424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typedef base::Callback<void(bool)> ResetCredentialsCB; 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) virtual ~MediaDrmBridge(); 387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Checks whether MediaDRM is available. 40a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // All other static methods check IsAvailable() internally. There's no need 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // to check IsAvailable() explicitly before calling them. 427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) static bool IsAvailable(); 437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 44a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool IsSecurityLevelSupported(const std::string& key_system, 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) SecurityLevel security_level); 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 47a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // TODO(xhwang): The |container_mime_type| is not the same as contentType in 48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // the EME spec. Revisit this once the spec issue with initData type is 49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // resolved. 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static bool IsKeySystemSupportedWithType( 51a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& key_system, 52a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& container_mime_type); 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static bool IsSecureDecoderRequired(SecurityLevel security_level); 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 563551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) static bool RegisterMediaDrmBridge(JNIEnv* env); 573551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 58a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Returns a MediaDrmBridge instance if |key_system| is supported, or a NULL 595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // pointer otherwise. 60a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static scoped_ptr<MediaDrmBridge> Create(int cdm_id, 61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string& key_system, 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const GURL& frame_url, 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaPlayerManager* manager); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns true if |security_level| is successfully set, or false otherwise. 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Call this function right after Create() and before any other calls. 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Note: 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - If this function is not called, the default security level of the device 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // will be used. 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - It's recommended to call this function only once on a MediaDrmBridge 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // object. Calling this function multiples times may cause errors. 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool SetSecurityLevel(SecurityLevel security_level); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) // MediaKeys implementations. 75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual bool CreateSession(uint32 session_id, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& content_type, 77a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const uint8* init_data, 78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int init_data_length) OVERRIDE; 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void LoadSession(uint32 session_id, 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& web_session_id) OVERRIDE; 81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void UpdateSession(uint32 session_id, 82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const uint8* response, 83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int response_length) OVERRIDE; 84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void ReleaseSession(uint32 session_id) OVERRIDE; 857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 86424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Returns a MediaCrypto object if it's already created. Returns a null object 87424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // otherwise. 88424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::android::ScopedJavaLocalRef<jobject> GetMediaCrypto(); 89424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 90424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Sets callback which will be called when MediaCrypto is ready. 91424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // If |closure| is null, previously set callback will be cleared. 92424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) void SetMediaCryptoReadyCB(const base::Closure& closure); 93424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 94424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Called after a MediaCrypto object is created. 95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnMediaCryptoReady(JNIEnv* env, jobject j_media_drm); 96a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 97a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Callbacks for firing session events. 98a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnSessionCreated(JNIEnv* env, 99a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) jobject j_media_drm, 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) jint j_session_id, 101a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) jstring j_web_session_id); 102a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnSessionMessage(JNIEnv* env, 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) jobject j_media_drm, 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) jint j_session_id, 105a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) jbyteArray j_message, 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) jstring j_destination_url); 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnSessionReady(JNIEnv* env, jobject j_media_drm, jint j_session_id); 108a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnSessionClosed(JNIEnv* env, jobject j_media_drm, jint j_session_id); 109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) void OnSessionError(JNIEnv* env, jobject j_media_drm, jint j_session_id); 1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Reset the device credentials. 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void ResetDeviceCredentials(const ResetCredentialsCB& callback); 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Called by the java object when credential reset is completed. 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) void OnResetDeviceCredentialsCompleted(JNIEnv* env, jobject, bool success); 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 117424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Helper function to determine whether a protected surface is needed for the 118424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // video playback. 119424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool IsProtectedSurfaceRequired(); 1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 121a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int cdm_id() const { return cdm_id_; } 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) GURL frame_url() const { return frame_url_; } 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private: 126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaDrmBridge(int cdm_id, 1273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) const std::vector<uint8>& scheme_uuid, 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL& frame_url, 129eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MediaPlayerManager* manager); 130eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 131424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) // Get the security level of the media. 132424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) SecurityLevel GetSecurityLevel(); 133424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 134a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // ID of the CDM object. 135a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) int cdm_id_; 1367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // UUID of the key system. 1383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) std::vector<uint8> scheme_uuid_; 1393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) 14068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // media stream's frame URL. 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const GURL frame_url_; 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1433551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) // Java MediaDrm instance. 1443551c9c881056c480085172ff9840cab31610854Torne (Richard Coles) base::android::ScopedJavaGlobalRef<jobject> j_media_drm_; 145eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 146eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // Non-owned pointer. 147eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch MediaPlayerManager* manager_; 148eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 149424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) base::Closure media_crypto_ready_cb_; 150424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ResetCredentialsCB reset_credentials_cb_; 15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MediaDrmBridge); 1547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}; 1557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)} // namespace media 1577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif // MEDIA_BASE_ANDROID_MEDIA_DRM_BRIDGE_H_ 159