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