media_keys.h revision f8ee788a64d60abd8f2d742a5fdedde054ecd910
1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
2868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// found in the LICENSE file.
4868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef MEDIA_BASE_MEDIA_KEYS_H_
6868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#define MEDIA_BASE_MEDIA_KEYS_H_
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include <string>
9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <vector>
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/basictypes.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/callback.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "media/base/media_export.h"
15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "url/gurl.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace media {
18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass Decryptor;
20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)template <typename T>
22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class CdmPromiseTemplate;
23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef CdmPromiseTemplate<std::string> NewSessionCdmPromise;
25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef CdmPromiseTemplate<void> SimpleCdmPromise;
26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Performs media key operations.
28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// All key operations are called on the renderer thread. Therefore, these calls
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// should be fast and nonblocking; key events should be fired asynchronously.
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MEDIA_EXPORT MediaKeys {
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Reported to UMA, so never reuse a value!
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Must be kept in sync with blink::WebMediaPlayerClient::MediaKeyErrorCode
35868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // (enforced in webmediaplayer_impl.cc).
36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // TODO(jrummell): Can this be moved to proxy_decryptor as it should only be
37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // used by the prefixed EME code?
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  enum KeyError {
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kUnknownError = 1,
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kClientError,
4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // The commented v0.1b values below have never been used.
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // kServiceError,
4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    kOutputError = 4,
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // kHardwareChangeError,
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // kDomainError,
46868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kMaxKeyError  // Must be last and greater than any legit value.
47868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
48868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Must be a superset of cdm::MediaKeyException.
50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  enum Exception {
51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    NOT_SUPPORTED_ERROR,
52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    INVALID_STATE_ERROR,
53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    INVALID_ACCESS_ERROR,
54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    QUOTA_EXCEEDED_ERROR,
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    UNKNOWN_ERROR,
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    CLIENT_ERROR,
57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    OUTPUT_ERROR
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Type of license required when creating/loading a session.
61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Must be consistent with the values specified in the spec:
62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // https://dvcs.w3.org/hg/html-media/raw-file/default/encrypted-media/encrypted-media.html#extensions
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  enum SessionType {
64f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    TEMPORARY_SESSION,
65f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    PERSISTENT_SESSION
66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  };
67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const static uint32 kInvalidSessionId = 0;
69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaKeys();
71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~MediaKeys();
72868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Creates a session with the |init_data_type|, |init_data| and |session_type|
74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // provided.
75a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Note: UpdateSession() and ReleaseSession() should only be called after
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |promise| is resolved.
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void CreateSession(const std::string& init_data_type,
78a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             const uint8* init_data,
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             int init_data_length,
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             SessionType session_type,
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             scoped_ptr<NewSessionCdmPromise> promise) = 0;
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Loads a session with the |web_session_id| provided.
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Note: UpdateSession() and ReleaseSession() should only be called after
85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // |promise| is resolved.
86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void LoadSession(const std::string& web_session_id,
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           scoped_ptr<NewSessionCdmPromise> promise) = 0;
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Updates a session specified by |web_session_id| with |response|.
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void UpdateSession(const std::string& web_session_id,
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             const uint8* response,
92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             int response_length,
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                             scoped_ptr<SimpleCdmPromise> promise) = 0;
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Releases the session specified by |web_session_id|.
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual void ReleaseSession(const std::string& web_session_id,
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                              scoped_ptr<SimpleCdmPromise> promise) = 0;
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
99eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Gets the Decryptor object associated with the MediaKeys. Returns NULL if
100eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // no Decryptor object is associated. The returned object is only guaranteed
101eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // to be valid during the MediaKeys' lifetime.
102eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual Decryptor* GetDecryptor();
103eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
104868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
105868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaKeys);
106868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
107868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
108868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Key event callbacks. See the spec for details:
109a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// https://dvcs.w3.org/hg/html-media/raw-file/default/encrypted-media/encrypted-media.html#event-summary
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef base::Callback<void(const std::string& web_session_id,
111eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            const std::vector<uint8>& message,
112cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            const GURL& destination_url)> SessionMessageCB;
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef base::Callback<void(const std::string& web_session_id)> SessionReadyCB;
115a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef base::Callback<void(const std::string& web_session_id)> SessionClosedCB;
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)typedef base::Callback<void(const std::string& web_session_id,
119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            MediaKeys::Exception exception_code,
120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            uint32 system_code,
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            const std::string& error_message)> SessionErrorCB;
122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
123868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace media
124868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // MEDIA_BASE_MEDIA_KEYS_H_
126