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 "media/filters/pipeline_integration_test_base.h" | 5 #include "media/filters/pipeline_integration_test_base.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/strings/string_util.h" | 10 #include "base/strings/string_util.h" |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
241 std::string jwk = GenerateJWKSet( | 241 std::string jwk = GenerateJWKSet( |
242 kSecretKey, arraysize(kSecretKey), key_id, key_id_length); | 242 kSecretKey, arraysize(kSecretKey), key_id, key_id_length); |
243 decryptor->UpdateSession(current_session_id_, | 243 decryptor->UpdateSession(current_session_id_, |
244 reinterpret_cast<const uint8*>(jwk.data()), | 244 reinterpret_cast<const uint8*>(jwk.data()), |
245 jwk.size()); | 245 jwk.size()); |
246 } | 246 } |
247 | 247 |
248 uint32 current_session_id_; | 248 uint32 current_session_id_; |
249 }; | 249 }; |
250 | 250 |
251 class RotatingKeyProvidingApp : public KeyProvidingApp { | |
252 public: | |
253 virtual void NeedKey(const std::string& type, | |
254 const std::vector<uint8>& init_data, | |
255 AesDecryptor* decryptor) OVERRIDE { | |
256 EXPECT_TRUE(decryptor->CreateSession(current_session_id_ + 1, | |
xhwang
2014/05/09 04:52:24
It'll be nice to make sure NeedKey is fired multip
kqyang
2014/05/09 21:07:25
Done.
| |
257 type, | |
258 vector_as_array(&init_data), | |
259 init_data.size())); | |
260 | |
261 std::vector<uint8> key_id; | |
262 std::vector<uint8> key; | |
263 EXPECT_TRUE(GetKeyAndKeyId(init_data, &key, &key_id)); | |
264 | |
265 // Convert key into a JSON structure and then add it. | |
266 std::string jwk = GenerateJWKSet(vector_as_array(&key), | |
267 key.size(), | |
268 vector_as_array(&key_id), | |
269 key_id.size()); | |
270 decryptor->UpdateSession(current_session_id_, | |
271 reinterpret_cast<const uint8*>(jwk.data()), | |
272 jwk.size()); | |
273 } | |
274 | |
275 private: | |
276 bool GetKeyAndKeyId(std::vector<uint8> init_data, | |
277 std::vector<uint8>* key, | |
278 std::vector<uint8>* key_id) { | |
279 // For WebM, init_data is key_id; for ISO CENC, init_data should contain | |
280 // the key_id. We assume key_id is in the end of init_data here (that is | |
281 // only a reasonable assumption for WebM and clear key ISO CENC). | |
282 DCHECK_GE(init_data.size(), arraysize(kKeyId)); | |
283 std::vector<uint8> key_id_from_init_data( | |
284 init_data.end() - arraysize(kKeyId), init_data.end()); | |
285 | |
286 // The Key and KeyId for this testing key provider are created by rotating | |
287 // kSecretKey and kKeyId. | |
288 key->assign(kSecretKey, kSecretKey + arraysize(kSecretKey)); | |
289 key_id->assign(kKeyId, kKeyId + arraysize(kKeyId)); | |
290 | |
291 // Find out the rotating position from |key_id_from_init_data| and apply on | |
292 // |key|. | |
293 for (size_t pos = 0; pos < arraysize(kKeyId); ++pos) { | |
294 std::rotate(key_id->begin(), key_id->begin() + pos, key_id->end()); | |
xhwang
2014/05/09 04:52:24
This "rotate" and "key rotation" are two different
kqyang
2014/05/09 21:07:25
Done.
| |
295 if (*key_id == key_id_from_init_data) { | |
296 std::rotate(key->begin(), key->begin() + pos, key->end()); | |
297 return true; | |
298 } | |
299 } | |
300 return false; | |
301 } | |
302 }; | |
303 | |
251 // Ignores needkey and does not perform a license request | 304 // Ignores needkey and does not perform a license request |
252 class NoResponseApp : public FakeEncryptedMedia::AppBase { | 305 class NoResponseApp : public FakeEncryptedMedia::AppBase { |
253 public: | 306 public: |
254 virtual void OnSessionCreated(uint32 session_id, | 307 virtual void OnSessionCreated(uint32 session_id, |
255 const std::string& web_session_id) OVERRIDE { | 308 const std::string& web_session_id) OVERRIDE { |
256 EXPECT_GT(session_id, 0u); | 309 EXPECT_GT(session_id, 0u); |
257 EXPECT_FALSE(web_session_id.empty()); | 310 EXPECT_FALSE(web_session_id.empty()); |
258 } | 311 } |
259 | 312 |
260 virtual void OnSessionMessage(uint32 session_id, | 313 virtual void OnSessionMessage(uint32 session_id, |
(...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
950 EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, | 1003 EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, |
951 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 1004 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
952 | 1005 |
953 Play(); | 1006 Play(); |
954 | 1007 |
955 EXPECT_TRUE(WaitUntilOnEnded()); | 1008 EXPECT_TRUE(WaitUntilOnEnded()); |
956 source.Abort(); | 1009 source.Abort(); |
957 Stop(); | 1010 Stop(); |
958 } | 1011 } |
959 | 1012 |
1013 TEST_P(PipelineIntegrationTest, | |
1014 MediaSource_ConfigChange_Encrypted_MP4_CENC_KeyRotation_VideoOnly) { | |
1015 MockMediaSource source("bear-640x360-v_frag-cenc-key_rotation.mp4", | |
1016 kMP4Video, kAppendWholeFile, GetParam()); | |
1017 FakeEncryptedMedia encrypted_media(new RotatingKeyProvidingApp()); | |
1018 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | |
1019 | |
1020 scoped_refptr<DecoderBuffer> second_file = | |
1021 ReadTestDataFile("bear-1280x720-v_frag-cenc-key_rotation.mp4"); | |
1022 | |
1023 source.AppendAtTime(base::TimeDelta::FromSeconds(kAppendTimeSec), | |
1024 second_file->data(), second_file->data_size()); | |
1025 | |
1026 source.EndOfStream(); | |
1027 | |
1028 EXPECT_EQ(1u, pipeline_->GetBufferedTimeRanges().size()); | |
1029 EXPECT_EQ(0, pipeline_->GetBufferedTimeRanges().start(0).InMilliseconds()); | |
1030 EXPECT_EQ(kAppendTimeMs + k1280IsoFileDurationMs, | |
1031 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | |
1032 | |
1033 Play(); | |
1034 | |
1035 EXPECT_TRUE(WaitUntilOnEnded()); | |
1036 source.Abort(); | |
1037 Stop(); | |
1038 } | |
1039 | |
960 // Config changes from clear to encrypted are not currently supported. | 1040 // Config changes from clear to encrypted are not currently supported. |
961 // TODO(ddorwin): Figure out why this CHECKs in AppendAtTime(). | 1041 // TODO(ddorwin): Figure out why this CHECKs in AppendAtTime(). |
962 TEST_P(PipelineIntegrationTest, | 1042 TEST_P(PipelineIntegrationTest, |
963 DISABLED_MediaSource_ConfigChange_ClearThenEncrypted_MP4_CENC) { | 1043 DISABLED_MediaSource_ConfigChange_ClearThenEncrypted_MP4_CENC) { |
964 MockMediaSource source("bear-640x360-av_frag.mp4", kMP4Video, | 1044 MockMediaSource source("bear-640x360-av_frag.mp4", kMP4Video, |
965 kAppendWholeFile, GetParam()); | 1045 kAppendWholeFile, GetParam()); |
966 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); | 1046 FakeEncryptedMedia encrypted_media(new KeyProvidingApp()); |
967 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | 1047 StartPipelineWithEncryptedMedia(&source, &encrypted_media); |
968 | 1048 |
969 scoped_refptr<DecoderBuffer> second_file = | 1049 scoped_refptr<DecoderBuffer> second_file = |
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1160 EXPECT_EQ(k1280IsoAVC3FileDurationMs, | 1240 EXPECT_EQ(k1280IsoAVC3FileDurationMs, |
1161 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); | 1241 pipeline_->GetBufferedTimeRanges().end(0).InMilliseconds()); |
1162 | 1242 |
1163 Play(); | 1243 Play(); |
1164 | 1244 |
1165 ASSERT_TRUE(WaitUntilOnEnded()); | 1245 ASSERT_TRUE(WaitUntilOnEnded()); |
1166 source.Abort(); | 1246 source.Abort(); |
1167 Stop(); | 1247 Stop(); |
1168 } | 1248 } |
1169 | 1249 |
1250 TEST_P(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_KeyRotation_Video) { | |
1251 MockMediaSource source("bear-1280x720-v_frag-cenc-key_rotation.mp4", | |
1252 kMP4Video, kAppendWholeFile, GetParam()); | |
1253 FakeEncryptedMedia encrypted_media(new RotatingKeyProvidingApp()); | |
1254 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | |
1255 | |
1256 source.EndOfStream(); | |
1257 ASSERT_EQ(PIPELINE_OK, pipeline_status_); | |
1258 | |
1259 Play(); | |
1260 | |
1261 ASSERT_TRUE(WaitUntilOnEnded()); | |
1262 source.Abort(); | |
1263 Stop(); | |
1264 } | |
1265 | |
1266 TEST_P(PipelineIntegrationTest, EncryptedPlayback_MP4_CENC_KeyRotation_Audio) { | |
1267 MockMediaSource source("bear-1280x720-a_frag-cenc-key_rotation.mp4", | |
1268 kMP4Audio, kAppendWholeFile, GetParam()); | |
1269 FakeEncryptedMedia encrypted_media(new RotatingKeyProvidingApp()); | |
1270 StartPipelineWithEncryptedMedia(&source, &encrypted_media); | |
1271 | |
1272 source.EndOfStream(); | |
1273 ASSERT_EQ(PIPELINE_OK, pipeline_status_); | |
1274 | |
1275 Play(); | |
1276 | |
1277 ASSERT_TRUE(WaitUntilOnEnded()); | |
1278 source.Abort(); | |
1279 Stop(); | |
1280 } | |
1170 #endif | 1281 #endif |
1171 | 1282 |
1172 // TODO(acolwell): Fix flakiness http://crbug.com/117921 | 1283 // TODO(acolwell): Fix flakiness http://crbug.com/117921 |
1173 TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePaused) { | 1284 TEST_F(PipelineIntegrationTest, DISABLED_SeekWhilePaused) { |
1174 ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); | 1285 ASSERT_TRUE(Start(GetTestDataFilePath("bear-320x240.webm"), PIPELINE_OK)); |
1175 | 1286 |
1176 base::TimeDelta duration(pipeline_->GetMediaDuration()); | 1287 base::TimeDelta duration(pipeline_->GetMediaDuration()); |
1177 base::TimeDelta start_seek_time(duration / 4); | 1288 base::TimeDelta start_seek_time(duration / 4); |
1178 base::TimeDelta seek_time(duration * 3 / 4); | 1289 base::TimeDelta seek_time(duration * 3 / 4); |
1179 | 1290 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1282 Play(); | 1393 Play(); |
1283 ASSERT_TRUE(WaitUntilOnEnded()); | 1394 ASSERT_TRUE(WaitUntilOnEnded()); |
1284 } | 1395 } |
1285 | 1396 |
1286 // TODO(wolenetz): Enable MSE testing of new frame processor based on this flag, | 1397 // TODO(wolenetz): Enable MSE testing of new frame processor based on this flag, |
1287 // once the new processor has landed. See http://crbug.com/249422. | 1398 // once the new processor has landed. See http://crbug.com/249422. |
1288 INSTANTIATE_TEST_CASE_P(LegacyFrameProcessor, PipelineIntegrationTest, | 1399 INSTANTIATE_TEST_CASE_P(LegacyFrameProcessor, PipelineIntegrationTest, |
1289 Values(true)); | 1400 Values(true)); |
1290 | 1401 |
1291 } // namespace media | 1402 } // namespace media |
OLD | NEW |