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 |