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"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "media/base/media_export.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "media/base/media_keys.h"
157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace media {
177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass MediaPlayerManager;
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// This class provides DRM services for android EME implementation.
217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// TODO(qinmin): implement all the functions in this class.
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class MEDIA_EXPORT MediaDrmBridge : public MediaKeys {
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~MediaDrmBridge();
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Returns a MediaDrmBridge instance if |uuid| is supported, or a NULL
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // pointer otherwise.
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  static MediaDrmBridge* Create(int media_keys_id,
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                const std::vector<uint8>& uuid,
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                                MediaPlayerManager* manager);
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Checks whether DRM is available.
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  static bool IsAvailable();
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // MediaKeys implementations.
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual bool GenerateKeyRequest(const std::string& type,
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  const uint8* init_data,
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                  int init_data_length) OVERRIDE;
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void AddKey(const uint8* key, int key_length,
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      const uint8* init_data, int init_data_length,
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                      const std::string& session_id) OVERRIDE;
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void CancelKeyRequest(const std::string& session_id) OVERRIDE;
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Drm related message was received.
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnDrmEvent(JNIEnv* env, jobject, jstring session_id,
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                  jint event, jint extra, jstring data);
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Called after we got the response for GenerateKeyRequest().
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnKeyMessage(JNIEnv* env, jobject, jstring session_id,
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                    jbyteArray message, jstring destination_url);
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Methods to create and release a MediaCrypto object.
53eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::android::ScopedJavaLocalRef<jobject> GetMediaCrypto();
547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int media_keys_id() const { return media_keys_id_; }
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
58eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MediaDrmBridge(int media_keys_id,
59eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 const std::vector<uint8>& uuid,
60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                 MediaPlayerManager* manager);
61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Id of the MediaKeys object.
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  int media_keys_id_;
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // UUID of the key system.
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  std::vector<uint8> uuid_;
67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Non-owned pointer.
69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  MediaPlayerManager* manager_;
70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaDrmBridge);
727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
737d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
747d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace media
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // MEDIA_BASE_ANDROID_MEDIA_DRM_BRIDGE_H_
77