| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef MEDIA_BASE_DECRYPTOR_H_ | 5 #ifndef MEDIA_BASE_DECRYPTOR_H_ |
| 6 #define MEDIA_BASE_DECRYPTOR_H_ | 6 #define MEDIA_BASE_DECRYPTOR_H_ |
| 7 | 7 |
| 8 #include <string> | 8 #include <string> |
| 9 | 9 |
| 10 #include "base/basictypes.h" | 10 #include "base/basictypes.h" |
| 11 #include "base/callback.h" | 11 #include "base/callback.h" |
| 12 #include "base/memory/ref_counted.h" | 12 #include "base/memory/ref_counted.h" |
| 13 #include "media/base/media_export.h" | 13 #include "media/base/media_export.h" |
| 14 | 14 |
| 15 namespace media { | 15 namespace media { |
| 16 | 16 |
| 17 class DecoderBuffer; | 17 class DecoderBuffer; |
| 18 class VideoDecoderConfig; |
| 19 class VideoFrame; |
| 18 | 20 |
| 19 // Performs key operations and decrypts encrypted buffer. | 21 // Performs key operations and decrypts (and decodes) encrypted buffer. |
| 20 // All public methods other than Decrypt() will be called on the renderer | 22 // |
| 21 // thread. Therefore, these calls should be fast and nonblocking, with key | 23 // Key operations (GenerateKeyRequest(), AddKey() and CancelKeyRequest()) |
| 22 // events fired asynchronously. Decrypt() will be called on the (video/audio) | 24 // are called on the renderer thread. Therefore, these calls should be fast |
| 23 // decoder thread. | 25 // and nonblocking; key events should be fired asynchronously. |
| 26 // All other methods are called on the (video/audio) decoder thread. |
| 27 // Decryptor implementations must be thread safe when methods are called |
| 28 // following the above model. |
| 29 // Depending on the implementation callbacks may be fired synchronously or |
| 30 // asynchronously. |
| 24 class MEDIA_EXPORT Decryptor { | 31 class MEDIA_EXPORT Decryptor { |
| 25 public: | 32 public: |
| 26 enum KeyError { | 33 enum KeyError { |
| 27 kUnknownError = 1, | 34 kUnknownError = 1, |
| 28 kClientError, | 35 kClientError, |
| 29 kServiceError, | 36 kServiceError, |
| 30 kOutputError, | 37 kOutputError, |
| 31 kHardwareChangeError, | 38 kHardwareChangeError, |
| 32 kDomainError | 39 kDomainError |
| 33 }; | 40 }; |
| 34 | 41 |
| 35 enum Status { | 42 enum Status { |
| 36 kSuccess, // Decryption successfully completed. Decrypted buffer ready. | 43 kSuccess, // Decryption successfully completed. Decrypted buffer ready. |
| 37 kNoKey, // No key is available to decrypt. | 44 kNoKey, // No key is available to decrypt. |
| 45 kNeedMoreData, // Decoder needs more data to produce a frame. |
| 38 kError // Key is available but an error occurred during decryption. | 46 kError // Key is available but an error occurred during decryption. |
| 39 }; | 47 }; |
| 40 | 48 |
| 41 Decryptor() {} | 49 Decryptor(); |
| 42 virtual ~Decryptor() {} | 50 virtual ~Decryptor(); |
| 43 | 51 |
| 44 // Generates a key request for the |key_system| with |init_data| provided. | 52 // Generates a key request for the |key_system| with |init_data| provided. |
| 45 // Returns true if generating key request succeeded, false otherwise. | 53 // Returns true if generating key request succeeded, false otherwise. |
| 46 // Note: AddKey() and CancelKeyRequest() should only be called after | 54 // Note: AddKey() and CancelKeyRequest() should only be called after |
| 47 // GenerateKeyRequest() returns true. | 55 // GenerateKeyRequest() returns true. |
| 48 virtual bool GenerateKeyRequest(const std::string& key_system, | 56 virtual bool GenerateKeyRequest(const std::string& key_system, |
| 49 const uint8* init_data, | 57 const uint8* init_data, |
| 50 int init_data_length) = 0; | 58 int init_data_length) = 0; |
| 51 | 59 |
| 52 // Adds a |key| to the |key_system|. The |key| is not limited to a decryption | 60 // Adds a |key| to the |key_system|. The |key| is not limited to a decryption |
| 53 // key. It can be any data that the key system accepts, such as a license. | 61 // key. It can be any data that the key system accepts, such as a license. |
| 54 // If multiple calls of this function set different keys for the same | 62 // If multiple calls of this function set different keys for the same |
| 55 // key ID, the older key will be replaced by the newer key. | 63 // key ID, the older key will be replaced by the newer key. |
| 56 virtual void AddKey(const std::string& key_system, | 64 virtual void AddKey(const std::string& key_system, |
| 57 const uint8* key, | 65 const uint8* key, |
| 58 int key_length, | 66 int key_length, |
| 59 const uint8* init_data, | 67 const uint8* init_data, |
| 60 int init_data_length, | 68 int init_data_length, |
| 61 const std::string& session_id) = 0; | 69 const std::string& session_id) = 0; |
| 62 | 70 |
| 63 // Cancels the key request specified by |session_id|. | 71 // Cancels the key request specified by |session_id|. |
| 64 virtual void CancelKeyRequest(const std::string& key_system, | 72 virtual void CancelKeyRequest(const std::string& key_system, |
| 65 const std::string& session_id) = 0; | 73 const std::string& session_id) = 0; |
| 66 | 74 |
| 75 // Indicates completion of a decryption operation. |
| 76 // |
| 77 // First parameter: The status of the decryption operation. |
| 78 // - Set to kSuccess if the encrypted buffer is successfully decrypted and |
| 79 // the decrypted buffer is ready to be read. |
| 80 // - Set to kNoKey if no decryption key is available to decrypt the encrypted |
| 81 // buffer. In this case the decrypted buffer must be NULL. |
| 82 // - Set to kError if unexpected error has occurred. In this case the |
| 83 // decrypted buffer must be NULL. |
| 84 // - This parameter should not be set to kNeedMoreData. |
| 85 // Second parameter: The decrypted buffer. |
| 86 typedef base::Callback<void(Status, |
| 87 const scoped_refptr<DecoderBuffer>&)> DecryptCB; |
| 88 |
| 67 // Decrypts the |encrypted| buffer. The decrypt status and decrypted buffer | 89 // Decrypts the |encrypted| buffer. The decrypt status and decrypted buffer |
| 68 // are returned via the provided callback |decrypt_cb|. The |encrypted| buffer | 90 // are returned via the provided callback |decrypt_cb|. The |encrypted| buffer |
| 69 // must not be NULL. | 91 // must not be NULL. |
| 70 // Decrypt() should not be called until any previous DecryptCB has completed. | 92 // Decrypt() should not be called until any previous DecryptCB has completed. |
| 71 // Thus, only one DecryptCB may be pending at a time. | 93 // Thus, only one DecryptCB may be pending at a time. |
| 72 // Note that the callback maybe called synchronously or asynchronously. | |
| 73 // | |
| 74 // If the returned status is kSuccess, the |encrypted| buffer is successfully | |
| 75 // decrypted and the decrypted buffer is ready to be read. | |
| 76 // If the returned status is kNoKey, no decryption key is available to decrypt | |
| 77 // |encrypted| buffer. In this case the decrypted buffer must be NULL. | |
| 78 // If the returned status is kError, unexpected error has occurred. In this | |
| 79 // case the decrypted buffer must be NULL. | |
| 80 typedef base::Callback<void(Status, | |
| 81 const scoped_refptr<DecoderBuffer>&)> DecryptCB; | |
| 82 virtual void Decrypt(const scoped_refptr<DecoderBuffer>& encrypted, | 94 virtual void Decrypt(const scoped_refptr<DecoderBuffer>& encrypted, |
| 83 const DecryptCB& decrypt_cb) = 0; | 95 const DecryptCB& decrypt_cb) = 0; |
| 84 | 96 |
| 85 // Cancels the scheduled decryption operation and fires the pending DecryptCB | 97 // Cancels the scheduled decryption operation and fires the pending DecryptCB |
| 86 // immediately with kSuccess and NULL. | 98 // immediately with kSuccess and NULL. |
| 87 // Decrypt() should not be called again before the pending DecryptCB is fired. | 99 // Decrypt() should not be called again before the pending DecryptCB is fired. |
| 88 virtual void CancelDecrypt() = 0; | 100 virtual void CancelDecrypt() = 0; |
| 89 | 101 |
| 102 // Indicates completion of decoder initialization. |
| 103 // |
| 104 // First Parameter: Indicates initialization success. |
| 105 // - Set to true if initialization was successful. False if an error occurred. |
| 106 typedef base::Callback<void(bool)> DecoderInitCB; |
| 107 |
| 108 // Initializes a video decoder with the given |config|, executing the |
| 109 // |init_cb| upon completion. |
| 110 // Note: DecryptAndDecodeVideo(), ResetVideoDecoder() and StopVideoDecoder() |
| 111 // can only be called after InitializeVideoDecoder() succeeded. |
| 112 virtual void InitializeVideoDecoder(const VideoDecoderConfig& config, |
| 113 const DecoderInitCB& init_cb) = 0; |
| 114 |
| 115 // Indicates completion of video decrypting and decoding operation. |
| 116 // |
| 117 // First parameter: The status of the decrypting and decoding operation. |
| 118 // - Set to kSuccess if the encrypted buffer is successfully decrypted and |
| 119 // decoded. In this case, the decoded video frame can be: |
| 120 // 1) NULL, which means the operation has been aborted. |
| 121 // 2) End-of-stream (EOS) frame, which means that the decoder has hit EOS, |
| 122 // flushed all internal buffers and cannot produce more video frames. |
| 123 // 3) Decrypted and decoded video frame. |
| 124 // - Set to kNoKey if no decryption key is available to decrypt the encrypted |
| 125 // buffer. In this case the decoded video frame must be NULL. |
| 126 // - Set to kNeedMoreData if more data is needed to produce a video frame. In |
| 127 // this case the decoded video frame must be NULL. |
| 128 // - Set to kError if unexpected error has occurred. In this case the |
| 129 // decoded video frame must be NULL. |
| 130 // Second parameter: The decoded video frame. |
| 131 typedef base::Callback<void(Status, |
| 132 const scoped_refptr<VideoFrame>&)> VideoDecodeCB; |
| 133 |
| 134 // Decrypts and decodes the |encrypted| buffer. The status and the decrypted |
| 135 // buffer are returned via the provided callback |video_decode_cb|. |
| 136 // The |encrypted| buffer must not be NULL. |
| 137 // At end-of-stream, this method should be called repeatedly with |
| 138 // end-of-stream DecoderBuffer until no video frame can be produced. |
| 139 virtual void DecryptAndDecodeVideo( |
| 140 const scoped_refptr<DecoderBuffer>& encrypted, |
| 141 const VideoDecodeCB& video_decode_cb) = 0; |
| 142 |
| 143 // Cancels scheduled video decrypt-and-decode operations and fires any pending |
| 144 // VideoDecodeCB immediately with kError and NULL frame. |
| 145 virtual void CancelDecryptAndDecodeVideo() = 0; |
| 146 |
| 147 // Stops decoder and sets it to an uninitialized state. |
| 148 // The decoder can be reinitialized by calling InitializeVideoDecoder() after |
| 149 // it is stopped. |
| 150 virtual void StopVideoDecoder() = 0; |
| 151 |
| 90 private: | 152 private: |
| 91 DISALLOW_COPY_AND_ASSIGN(Decryptor); | 153 DISALLOW_COPY_AND_ASSIGN(Decryptor); |
| 92 }; | 154 }; |
| 93 | 155 |
| 94 } // namespace media | 156 } // namespace media |
| 95 | 157 |
| 96 #endif // MEDIA_BASE_DECRYPTOR_H_ | 158 #endif // MEDIA_BASE_DECRYPTOR_H_ |
| OLD | NEW |