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 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include <memory> | 8 #include <memory> |
9 #include <utility> | 9 #include <utility> |
10 | 10 |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
201 class FakeEncryptedMedia { | 201 class FakeEncryptedMedia { |
202 public: | 202 public: |
203 // Defines the behavior of the "app" that responds to EME events. | 203 // Defines the behavior of the "app" that responds to EME events. |
204 class AppBase { | 204 class AppBase { |
205 public: | 205 public: |
206 virtual ~AppBase() {} | 206 virtual ~AppBase() {} |
207 | 207 |
208 virtual void OnSessionMessage(const std::string& session_id, | 208 virtual void OnSessionMessage(const std::string& session_id, |
209 MediaKeys::MessageType message_type, | 209 MediaKeys::MessageType message_type, |
210 const std::vector<uint8_t>& message, | 210 const std::vector<uint8_t>& message, |
211 const GURL& legacy_destination_url, | |
212 AesDecryptor* decryptor) = 0; | 211 AesDecryptor* decryptor) = 0; |
213 | 212 |
214 virtual void OnSessionClosed(const std::string& session_id) = 0; | 213 virtual void OnSessionClosed(const std::string& session_id) = 0; |
215 | 214 |
216 virtual void OnSessionKeysChange(const std::string& session_id, | 215 virtual void OnSessionKeysChange(const std::string& session_id, |
217 bool has_additional_usable_key, | 216 bool has_additional_usable_key, |
218 CdmKeysInfo keys_info) = 0; | 217 CdmKeysInfo keys_info) = 0; |
219 | 218 |
220 // Errors are not expected unless overridden. | |
221 virtual void OnLegacySessionError(const std::string& session_id, | |
222 const std::string& error_name, | |
223 uint32_t system_code, | |
224 const std::string& error_message) { | |
225 FAIL() << "Unexpected Key Error"; | |
226 } | |
227 | |
228 virtual void OnEncryptedMediaInitData(EmeInitDataType init_data_type, | 219 virtual void OnEncryptedMediaInitData(EmeInitDataType init_data_type, |
229 const std::vector<uint8_t>& init_data, | 220 const std::vector<uint8_t>& init_data, |
230 AesDecryptor* decryptor) = 0; | 221 AesDecryptor* decryptor) = 0; |
231 }; | 222 }; |
232 | 223 |
233 FakeEncryptedMedia(AppBase* app) | 224 FakeEncryptedMedia(AppBase* app) |
234 : decryptor_(new AesDecryptor( | 225 : decryptor_(new AesDecryptor( |
235 GURL::EmptyGURL(), | 226 GURL::EmptyGURL(), |
236 base::Bind(&FakeEncryptedMedia::OnSessionMessage, | 227 base::Bind(&FakeEncryptedMedia::OnSessionMessage, |
237 base::Unretained(this)), | 228 base::Unretained(this)), |
238 base::Bind(&FakeEncryptedMedia::OnSessionClosed, | 229 base::Bind(&FakeEncryptedMedia::OnSessionClosed, |
239 base::Unretained(this)), | 230 base::Unretained(this)), |
240 base::Bind(&FakeEncryptedMedia::OnSessionKeysChange, | 231 base::Bind(&FakeEncryptedMedia::OnSessionKeysChange, |
241 base::Unretained(this)))), | 232 base::Unretained(this)))), |
242 cdm_context_(decryptor_.get()), | 233 cdm_context_(decryptor_.get()), |
243 app_(app) {} | 234 app_(app) {} |
244 | 235 |
245 CdmContext* GetCdmContext() { return &cdm_context_; } | 236 CdmContext* GetCdmContext() { return &cdm_context_; } |
246 | 237 |
247 // Callbacks for firing session events. Delegate to |app_|. | 238 // Callbacks for firing session events. Delegate to |app_|. |
248 void OnSessionMessage(const std::string& session_id, | 239 void OnSessionMessage(const std::string& session_id, |
249 MediaKeys::MessageType message_type, | 240 MediaKeys::MessageType message_type, |
250 const std::vector<uint8_t>& message, | 241 const std::vector<uint8_t>& message) { |
251 const GURL& legacy_destination_url) { | 242 app_->OnSessionMessage(session_id, message_type, message, decryptor_.get()); |
252 app_->OnSessionMessage(session_id, message_type, message, | |
253 legacy_destination_url, decryptor_.get()); | |
254 } | 243 } |
255 | 244 |
256 void OnSessionClosed(const std::string& session_id) { | 245 void OnSessionClosed(const std::string& session_id) { |
257 app_->OnSessionClosed(session_id); | 246 app_->OnSessionClosed(session_id); |
258 } | 247 } |
259 | 248 |
260 void OnSessionKeysChange(const std::string& session_id, | 249 void OnSessionKeysChange(const std::string& session_id, |
261 bool has_additional_usable_key, | 250 bool has_additional_usable_key, |
262 CdmKeysInfo keys_info) { | 251 CdmKeysInfo keys_info) { |
263 app_->OnSessionKeysChange(session_id, has_additional_usable_key, | 252 app_->OnSessionKeysChange(session_id, has_additional_usable_key, |
264 std::move(keys_info)); | 253 std::move(keys_info)); |
265 } | 254 } |
266 | 255 |
267 void OnLegacySessionError(const std::string& session_id, | |
268 const std::string& error_name, | |
269 uint32_t system_code, | |
270 const std::string& error_message) { | |
271 app_->OnLegacySessionError(session_id, error_name, system_code, | |
272 error_message); | |
273 } | |
274 | |
275 void OnEncryptedMediaInitData(EmeInitDataType init_data_type, | 256 void OnEncryptedMediaInitData(EmeInitDataType init_data_type, |
276 const std::vector<uint8_t>& init_data) { | 257 const std::vector<uint8_t>& init_data) { |
277 app_->OnEncryptedMediaInitData(init_data_type, init_data, decryptor_.get()); | 258 app_->OnEncryptedMediaInitData(init_data_type, init_data, decryptor_.get()); |
278 } | 259 } |
279 | 260 |
280 private: | 261 private: |
281 class TestCdmContext : public CdmContext { | 262 class TestCdmContext : public CdmContext { |
282 public: | 263 public: |
283 TestCdmContext(Decryptor* decryptor) : decryptor_(decryptor) {} | 264 TestCdmContext(Decryptor* decryptor) : decryptor_(decryptor) {} |
284 | 265 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 base::Bind(&KeyProvidingApp::OnResolveWithSession, | 315 base::Bind(&KeyProvidingApp::OnResolveWithSession, |
335 base::Unretained(this), expected), | 316 base::Unretained(this), expected), |
336 base::Bind(&KeyProvidingApp::OnReject, base::Unretained(this), | 317 base::Bind(&KeyProvidingApp::OnReject, base::Unretained(this), |
337 expected))); | 318 expected))); |
338 return promise; | 319 return promise; |
339 } | 320 } |
340 | 321 |
341 void OnSessionMessage(const std::string& session_id, | 322 void OnSessionMessage(const std::string& session_id, |
342 MediaKeys::MessageType message_type, | 323 MediaKeys::MessageType message_type, |
343 const std::vector<uint8_t>& message, | 324 const std::vector<uint8_t>& message, |
344 const GURL& legacy_destination_url, | |
345 AesDecryptor* decryptor) override { | 325 AesDecryptor* decryptor) override { |
346 EXPECT_FALSE(session_id.empty()); | 326 EXPECT_FALSE(session_id.empty()); |
347 EXPECT_FALSE(message.empty()); | 327 EXPECT_FALSE(message.empty()); |
348 EXPECT_EQ(current_session_id_, session_id); | 328 EXPECT_EQ(current_session_id_, session_id); |
349 EXPECT_EQ(MediaKeys::MessageType::LICENSE_REQUEST, message_type); | 329 EXPECT_EQ(MediaKeys::MessageType::LICENSE_REQUEST, message_type); |
350 | 330 |
351 // Extract the key ID from |message|. For Clear Key this is a JSON object | 331 // Extract the key ID from |message|. For Clear Key this is a JSON object |
352 // containing a set of "kids". There should only be 1 key ID in |message|. | 332 // containing a set of "kids". There should only be 1 key ID in |message|. |
353 std::string message_string(message.begin(), message.end()); | 333 std::string message_string(message.begin(), message.end()); |
354 KeyIdList key_ids; | 334 KeyIdList key_ids; |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
456 | 436 |
457 uint32_t num_distinct_need_key_calls_; | 437 uint32_t num_distinct_need_key_calls_; |
458 }; | 438 }; |
459 | 439 |
460 // Ignores the encrypted event and does not perform a license request. | 440 // Ignores the encrypted event and does not perform a license request. |
461 class NoResponseApp : public FakeEncryptedMedia::AppBase { | 441 class NoResponseApp : public FakeEncryptedMedia::AppBase { |
462 public: | 442 public: |
463 void OnSessionMessage(const std::string& session_id, | 443 void OnSessionMessage(const std::string& session_id, |
464 MediaKeys::MessageType message_type, | 444 MediaKeys::MessageType message_type, |
465 const std::vector<uint8_t>& message, | 445 const std::vector<uint8_t>& message, |
466 const GURL& legacy_destination_url, | |
467 AesDecryptor* decryptor) override { | 446 AesDecryptor* decryptor) override { |
468 EXPECT_FALSE(session_id.empty()); | 447 EXPECT_FALSE(session_id.empty()); |
469 EXPECT_FALSE(message.empty()); | 448 EXPECT_FALSE(message.empty()); |
470 FAIL() << "Unexpected Message"; | 449 FAIL() << "Unexpected Message"; |
471 } | 450 } |
472 | 451 |
473 void OnSessionClosed(const std::string& session_id) override { | 452 void OnSessionClosed(const std::string& session_id) override { |
474 EXPECT_FALSE(session_id.empty()); | 453 EXPECT_FALSE(session_id.empty()); |
475 FAIL() << "Unexpected Closed"; | 454 FAIL() << "Unexpected Closed"; |
476 } | 455 } |
(...skipping 1921 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2398 | 2377 |
2399 TEST_F(PipelineIntegrationTest, BasicPlaybackPositiveStartTime) { | 2378 TEST_F(PipelineIntegrationTest, BasicPlaybackPositiveStartTime) { |
2400 ASSERT_EQ(PIPELINE_OK, Start("nonzero-start-time.webm")); | 2379 ASSERT_EQ(PIPELINE_OK, Start("nonzero-start-time.webm")); |
2401 Play(); | 2380 Play(); |
2402 ASSERT_TRUE(WaitUntilOnEnded()); | 2381 ASSERT_TRUE(WaitUntilOnEnded()); |
2403 ASSERT_EQ(base::TimeDelta::FromMicroseconds(396000), | 2382 ASSERT_EQ(base::TimeDelta::FromMicroseconds(396000), |
2404 demuxer_->GetStartTime()); | 2383 demuxer_->GetStartTime()); |
2405 } | 2384 } |
2406 | 2385 |
2407 } // namespace media | 2386 } // namespace media |
OLD | NEW |