media_keys.h revision cedac228d2dd51db4b79ea1e72c7f249408ee061
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
21868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Performs media key operations.
22868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
23868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// All key operations are called on the renderer thread. Therefore, these calls
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// should be fast and nonblocking; key events should be fired asynchronously.
25868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)class MEDIA_EXPORT MediaKeys {
26868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) public:
27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // Reported to UMA, so never reuse a value!
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // Must be kept in sync with blink::WebMediaPlayerClient::MediaKeyErrorCode
29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  // (enforced in webmediaplayer_impl.cc).
30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  enum KeyError {
31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kUnknownError = 1,
32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kClientError,
3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    // The commented v0.1b values below have never been used.
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // kServiceError,
3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)    kOutputError = 4,
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // kHardwareChangeError,
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    // kDomainError,
38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)    kMaxKeyError  // Must be last and greater than any legit value.
39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  };
40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  const static uint32 kInvalidSessionId = 0;
42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
43868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  MediaKeys();
44868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  virtual ~MediaKeys();
45868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Creates a session with the |content_type| and |init_data| provided.
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Returns true if a session is successfully created, false otherwise.
48a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Note: UpdateSession() and ReleaseSession() should only be called after
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // SessionCreatedCB is fired.
50a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // TODO(jrummell): Remove return value when prefixed API is removed.
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // See http://crbug.com/342510
52a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual bool CreateSession(uint32 session_id,
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                             const std::string& content_type,
54a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             const uint8* init_data,
55a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             int init_data_length) = 0;
56a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Loads a session with the |web_session_id| provided.
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Note: UpdateSession() and ReleaseSession() should only be called after
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // SessionCreatedCB is fired.
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void LoadSession(uint32 session_id,
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                           const std::string& web_session_id) = 0;
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
63a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Updates a session specified by |session_id| with |response|.
64a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void UpdateSession(uint32 session_id,
65a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             const uint8* response,
66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                             int response_length) = 0;
67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Releases the session specified by |session_id|.
69a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual void ReleaseSession(uint32 session_id) = 0;
70868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Gets the Decryptor object associated with the MediaKeys. Returns NULL if
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // no Decryptor object is associated. The returned object is only guaranteed
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // to be valid during the MediaKeys' lifetime.
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual Decryptor* GetDecryptor();
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
76868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) private:
77868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MediaKeys);
78868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)};
79868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
80868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Key event callbacks. See the spec for details:
81a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)// https://dvcs.w3.org/hg/html-media/raw-file/default/encrypted-media/encrypted-media.html#event-summary
82a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)typedef base::Callback<
83a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    void(uint32 session_id, const std::string& web_session_id)>
84a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    SessionCreatedCB;
85868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
86a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)typedef base::Callback<void(uint32 session_id,
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch                            const std::vector<uint8>& message,
88cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                            const GURL& destination_url)> SessionMessageCB;
89a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
90a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)typedef base::Callback<void(uint32 session_id)> SessionReadyCB;
91a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
92a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)typedef base::Callback<void(uint32 session_id)> SessionClosedCB;
93a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
94a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)typedef base::Callback<void(uint32 session_id,
95a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                            media::MediaKeys::KeyError error_code,
96a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                            uint32 system_code)> SessionErrorCB;
97f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
98868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}  // namespace media
99868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
100868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#endif  // MEDIA_BASE_MEDIA_KEYS_H_
101