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