| 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 "base/bind.h" | 5 #include "base/bind.h" |
| 6 #include "base/command_line.h" | 6 #include "base/command_line.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/strings/string_util.h" | 8 #include "base/strings/string_util.h" |
| 9 #include "build/build_config.h" | 9 #include "build/build_config.h" |
| 10 #include "media/base/cdm_callback_promise.h" | 10 #include "media/base/cdm_callback_promise.h" |
| (...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 310 return; | 310 return; |
| 311 prev_init_data_ = init_data; | 311 prev_init_data_ = init_data; |
| 312 | 312 |
| 313 if (current_session_id_.empty()) { | 313 if (current_session_id_.empty()) { |
| 314 if (init_data_type == EmeInitDataType::CENC) { | 314 if (init_data_type == EmeInitDataType::CENC) { |
| 315 // Since the 'cenc' files are not created with proper 'pssh' boxes, | 315 // Since the 'cenc' files are not created with proper 'pssh' boxes, |
| 316 // simply pretend that this is a webm file and pass the expected | 316 // simply pretend that this is a webm file and pass the expected |
| 317 // key ID as the init_data. | 317 // key ID as the init_data. |
| 318 // http://crbug.com/460308 | 318 // http://crbug.com/460308 |
| 319 decryptor->CreateSessionAndGenerateRequest( | 319 decryptor->CreateSessionAndGenerateRequest( |
| 320 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, kKeyId, | 320 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, |
| 321 arraysize(kKeyId), CreateSessionPromise(RESOLVED)); | 321 std::vector<uint8>(kKeyId, kKeyId + arraysize(kKeyId)), |
| 322 CreateSessionPromise(RESOLVED)); |
| 322 } else { | 323 } else { |
| 323 decryptor->CreateSessionAndGenerateRequest( | 324 decryptor->CreateSessionAndGenerateRequest( |
| 324 MediaKeys::TEMPORARY_SESSION, init_data_type, | 325 MediaKeys::TEMPORARY_SESSION, init_data_type, init_data, |
| 325 vector_as_array(&init_data), init_data.size(), | |
| 326 CreateSessionPromise(RESOLVED)); | 326 CreateSessionPromise(RESOLVED)); |
| 327 } | 327 } |
| 328 EXPECT_FALSE(current_session_id_.empty()); | 328 EXPECT_FALSE(current_session_id_.empty()); |
| 329 } | 329 } |
| 330 | 330 |
| 331 // Clear Key really needs the key ID from |init_data|. For WebM, they are | 331 // Clear Key really needs the key ID from |init_data|. For WebM, they are |
| 332 // the same, but this is not the case for ISO CENC (key ID embedded in a | 332 // the same, but this is not the case for ISO CENC (key ID embedded in a |
| 333 // 'pssh' box). Therefore, provide the correct key ID. | 333 // 'pssh' box). Therefore, provide the correct key ID. |
| 334 const uint8* key_id = vector_as_array(&init_data); | 334 const uint8* key_id = vector_as_array(&init_data); |
| 335 size_t key_id_length = init_data.size(); | 335 size_t key_id_length = init_data.size(); |
| 336 if (init_data_type == EmeInitDataType::CENC) { | 336 if (init_data_type == EmeInitDataType::CENC) { |
| 337 key_id = kKeyId; | 337 key_id = kKeyId; |
| 338 key_id_length = arraysize(kKeyId); | 338 key_id_length = arraysize(kKeyId); |
| 339 } | 339 } |
| 340 | 340 |
| 341 // Convert key into a JSON structure and then add it. | 341 // Convert key into a JSON structure and then add it. |
| 342 std::string jwk = GenerateJWKSet( | 342 std::string jwk = GenerateJWKSet( |
| 343 kSecretKey, arraysize(kSecretKey), key_id, key_id_length); | 343 kSecretKey, arraysize(kSecretKey), key_id, key_id_length); |
| 344 decryptor->UpdateSession(current_session_id_, | 344 decryptor->UpdateSession(current_session_id_, |
| 345 reinterpret_cast<const uint8*>(jwk.data()), | 345 std::vector<uint8>(jwk.begin(), jwk.end()), |
| 346 jwk.size(), | |
| 347 CreatePromise(RESOLVED)); | 346 CreatePromise(RESOLVED)); |
| 348 } | 347 } |
| 349 | 348 |
| 350 std::string current_session_id_; | 349 std::string current_session_id_; |
| 351 std::vector<uint8> prev_init_data_; | 350 std::vector<uint8> prev_init_data_; |
| 352 }; | 351 }; |
| 353 | 352 |
| 354 class RotatingKeyProvidingApp : public KeyProvidingApp { | 353 class RotatingKeyProvidingApp : public KeyProvidingApp { |
| 355 public: | 354 public: |
| 356 RotatingKeyProvidingApp() : num_distint_need_key_calls_(0) {} | 355 RotatingKeyProvidingApp() : num_distint_need_key_calls_(0) {} |
| (...skipping 15 matching lines...) Expand all Loading... |
| 372 std::vector<uint8> key_id; | 371 std::vector<uint8> key_id; |
| 373 std::vector<uint8> key; | 372 std::vector<uint8> key; |
| 374 EXPECT_TRUE(GetKeyAndKeyId(init_data, &key, &key_id)); | 373 EXPECT_TRUE(GetKeyAndKeyId(init_data, &key, &key_id)); |
| 375 | 374 |
| 376 if (init_data_type == EmeInitDataType::CENC) { | 375 if (init_data_type == EmeInitDataType::CENC) { |
| 377 // Since the 'cenc' files are not created with proper 'pssh' boxes, | 376 // Since the 'cenc' files are not created with proper 'pssh' boxes, |
| 378 // simply pretend that this is a webm file and pass the expected | 377 // simply pretend that this is a webm file and pass the expected |
| 379 // key ID as the init_data. | 378 // key ID as the init_data. |
| 380 // http://crbug.com/460308 | 379 // http://crbug.com/460308 |
| 381 decryptor->CreateSessionAndGenerateRequest( | 380 decryptor->CreateSessionAndGenerateRequest( |
| 382 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, | 381 MediaKeys::TEMPORARY_SESSION, EmeInitDataType::WEBM, key_id, |
| 383 vector_as_array(&key_id), key_id.size(), | |
| 384 CreateSessionPromise(RESOLVED)); | 382 CreateSessionPromise(RESOLVED)); |
| 385 } else { | 383 } else { |
| 386 decryptor->CreateSessionAndGenerateRequest( | 384 decryptor->CreateSessionAndGenerateRequest( |
| 387 MediaKeys::TEMPORARY_SESSION, init_data_type, | 385 MediaKeys::TEMPORARY_SESSION, init_data_type, init_data, |
| 388 vector_as_array(&init_data), init_data.size(), | |
| 389 CreateSessionPromise(RESOLVED)); | 386 CreateSessionPromise(RESOLVED)); |
| 390 } | 387 } |
| 391 | 388 |
| 392 // Convert key into a JSON structure and then add it. | 389 // Convert key into a JSON structure and then add it. |
| 393 std::string jwk = GenerateJWKSet(vector_as_array(&key), | 390 std::string jwk = GenerateJWKSet(vector_as_array(&key), |
| 394 key.size(), | 391 key.size(), |
| 395 vector_as_array(&key_id), | 392 vector_as_array(&key_id), |
| 396 key_id.size()); | 393 key_id.size()); |
| 397 decryptor->UpdateSession(current_session_id_, | 394 decryptor->UpdateSession(current_session_id_, |
| 398 reinterpret_cast<const uint8*>(jwk.data()), | 395 std::vector<uint8>(jwk.begin(), jwk.end()), |
| 399 jwk.size(), | |
| 400 CreatePromise(RESOLVED)); | 396 CreatePromise(RESOLVED)); |
| 401 } | 397 } |
| 402 | 398 |
| 403 private: | 399 private: |
| 404 bool GetKeyAndKeyId(std::vector<uint8> init_data, | 400 bool GetKeyAndKeyId(std::vector<uint8> init_data, |
| 405 std::vector<uint8>* key, | 401 std::vector<uint8>* key, |
| 406 std::vector<uint8>* key_id) { | 402 std::vector<uint8>* key_id) { |
| 407 // For WebM, init_data is key_id; for ISO CENC, init_data should contain | 403 // For WebM, init_data is key_id; for ISO CENC, init_data should contain |
| 408 // the key_id. We assume key_id is in the end of init_data here (that is | 404 // the key_id. We assume key_id is in the end of init_data here (that is |
| 409 // only a reasonable assumption for WebM and clear key ISO CENC). | 405 // only a reasonable assumption for WebM and clear key ISO CENC). |
| (...skipping 1327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1737 | 1733 |
| 1738 TEST_F(PipelineIntegrationTest, BasicPlaybackPositiveStartTime) { | 1734 TEST_F(PipelineIntegrationTest, BasicPlaybackPositiveStartTime) { |
| 1739 ASSERT_EQ(PIPELINE_OK, Start("nonzero-start-time.webm")); | 1735 ASSERT_EQ(PIPELINE_OK, Start("nonzero-start-time.webm")); |
| 1740 Play(); | 1736 Play(); |
| 1741 ASSERT_TRUE(WaitUntilOnEnded()); | 1737 ASSERT_TRUE(WaitUntilOnEnded()); |
| 1742 ASSERT_EQ(base::TimeDelta::FromMicroseconds(396000), | 1738 ASSERT_EQ(base::TimeDelta::FromMicroseconds(396000), |
| 1743 demuxer_->GetStartTime()); | 1739 demuxer_->GetStartTime()); |
| 1744 } | 1740 } |
| 1745 | 1741 |
| 1746 } // namespace media | 1742 } // namespace media |
| OLD | NEW |