| 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 <algorithm> | 5 #include <algorithm> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/logging.h" | 8 #include "base/logging.h" |
| 9 #include "media/base/decrypt_config.h" | 9 #include "media/base/decrypt_config.h" |
| 10 #include "media/webm/cluster_builder.h" | 10 #include "media/webm/cluster_builder.h" |
| (...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 196 WebMClusterParser::BufferQueue* dest) { | 196 WebMClusterParser::BufferQueue* dest) { |
| 197 for (WebMClusterParser::BufferQueue::const_iterator itr = src.begin(); | 197 for (WebMClusterParser::BufferQueue::const_iterator itr = src.begin(); |
| 198 itr != src.end(); ++itr) { | 198 itr != src.end(); ++itr) { |
| 199 dest->push_back(*itr); | 199 dest->push_back(*itr); |
| 200 } | 200 } |
| 201 } | 201 } |
| 202 | 202 |
| 203 class WebMClusterParserTest : public testing::Test { | 203 class WebMClusterParserTest : public testing::Test { |
| 204 public: | 204 public: |
| 205 WebMClusterParserTest() | 205 WebMClusterParserTest() |
| 206 : parser_(new WebMClusterParser( | 206 : parser_(new WebMClusterParser(kTimecodeScale, |
| 207 kTimecodeScale, kAudioTrackNum, kVideoTrackNum, | 207 kAudioTrackNum, |
| 208 std::set<int>(), | 208 kVideoTrackNum, |
| 209 std::set<int64>(), | 209 std::set<int>(), |
| 210 "", "", | 210 std::set<int64>(), |
| 211 LogCB())) { | 211 std::string(), |
| 212 } | 212 std::string(), |
| 213 LogCB())) {} |
| 213 | 214 |
| 214 protected: | 215 protected: |
| 215 scoped_ptr<WebMClusterParser> parser_; | 216 scoped_ptr<WebMClusterParser> parser_; |
| 216 }; | 217 }; |
| 217 | 218 |
| 218 TEST_F(WebMClusterParserTest, TestReset) { | 219 TEST_F(WebMClusterParserTest, TestReset) { |
| 219 InSequence s; | 220 InSequence s; |
| 220 | 221 |
| 221 int block_count = arraysize(kDefaultBlockInfo); | 222 int block_count = arraysize(kDefaultBlockInfo); |
| 222 scoped_ptr<Cluster> cluster(CreateCluster(0, kDefaultBlockInfo, block_count)); | 223 scoped_ptr<Cluster> cluster(CreateCluster(0, kDefaultBlockInfo, block_count)); |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 327 | 328 |
| 328 int result = parser_->Parse(cluster->data(), cluster->size()); | 329 int result = parser_->Parse(cluster->data(), cluster->size()); |
| 329 EXPECT_EQ(cluster->size(), result); | 330 EXPECT_EQ(cluster->size(), result); |
| 330 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); | 331 ASSERT_TRUE(VerifyBuffers(parser_, kBlockInfo, block_count)); |
| 331 } | 332 } |
| 332 | 333 |
| 333 TEST_F(WebMClusterParserTest, IgnoredTracks) { | 334 TEST_F(WebMClusterParserTest, IgnoredTracks) { |
| 334 std::set<int64> ignored_tracks; | 335 std::set<int64> ignored_tracks; |
| 335 ignored_tracks.insert(kTextTrackNum); | 336 ignored_tracks.insert(kTextTrackNum); |
| 336 | 337 |
| 337 parser_.reset(new WebMClusterParser( | 338 parser_.reset(new WebMClusterParser(kTimecodeScale, |
| 338 kTimecodeScale, kAudioTrackNum, kVideoTrackNum, | 339 kAudioTrackNum, |
| 339 std::set<int>(), | 340 kVideoTrackNum, |
| 340 ignored_tracks, "", "", | 341 std::set<int>(), |
| 341 LogCB())); | 342 ignored_tracks, |
| 343 std::string(), |
| 344 std::string(), |
| 345 LogCB())); |
| 342 | 346 |
| 343 const BlockInfo kInputBlockInfo[] = { | 347 const BlockInfo kInputBlockInfo[] = { |
| 344 { kAudioTrackNum, 0, 23, true }, | 348 { kAudioTrackNum, 0, 23, true }, |
| 345 { kAudioTrackNum, 23, 23, true }, | 349 { kAudioTrackNum, 23, 23, true }, |
| 346 { kVideoTrackNum, 33, 33, true }, | 350 { kVideoTrackNum, 33, 33, true }, |
| 347 { kTextTrackNum, 33, 99, true }, | 351 { kTextTrackNum, 33, 99, true }, |
| 348 { kAudioTrackNum, 46, 23, true }, | 352 { kAudioTrackNum, 46, 23, true }, |
| 349 { kVideoTrackNum, 67, 33, true }, | 353 { kVideoTrackNum, 67, 33, true }, |
| 350 }; | 354 }; |
| 351 int input_block_count = arraysize(kInputBlockInfo); | 355 int input_block_count = arraysize(kInputBlockInfo); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 364 | 368 |
| 365 int result = parser_->Parse(cluster->data(), cluster->size()); | 369 int result = parser_->Parse(cluster->data(), cluster->size()); |
| 366 EXPECT_EQ(cluster->size(), result); | 370 EXPECT_EQ(cluster->size(), result); |
| 367 ASSERT_TRUE(VerifyBuffers(parser_, kOutputBlockInfo, output_block_count)); | 371 ASSERT_TRUE(VerifyBuffers(parser_, kOutputBlockInfo, output_block_count)); |
| 368 } | 372 } |
| 369 | 373 |
| 370 TEST_F(WebMClusterParserTest, ParseTextTracks) { | 374 TEST_F(WebMClusterParserTest, ParseTextTracks) { |
| 371 std::set<int> text_tracks; | 375 std::set<int> text_tracks; |
| 372 text_tracks.insert(kTextTrackNum); | 376 text_tracks.insert(kTextTrackNum); |
| 373 | 377 |
| 374 parser_.reset(new WebMClusterParser( | 378 parser_.reset(new WebMClusterParser(kTimecodeScale, |
| 375 kTimecodeScale, kAudioTrackNum, kVideoTrackNum, | 379 kAudioTrackNum, |
| 376 text_tracks, | 380 kVideoTrackNum, |
| 377 std::set<int64>(), "", "", | 381 text_tracks, |
| 378 LogCB())); | 382 std::set<int64>(), |
| 383 std::string(), |
| 384 std::string(), |
| 385 LogCB())); |
| 379 | 386 |
| 380 const BlockInfo kInputBlockInfo[] = { | 387 const BlockInfo kInputBlockInfo[] = { |
| 381 { kAudioTrackNum, 0, 23, true }, | 388 { kAudioTrackNum, 0, 23, true }, |
| 382 { kAudioTrackNum, 23, 23, true }, | 389 { kAudioTrackNum, 23, 23, true }, |
| 383 { kVideoTrackNum, 33, 33, true }, | 390 { kVideoTrackNum, 33, 33, true }, |
| 384 { kTextTrackNum, 33, 42, false }, | 391 { kTextTrackNum, 33, 42, false }, |
| 385 { kAudioTrackNum, 46, 23, true }, | 392 { kAudioTrackNum, 46, 23, true }, |
| 386 { kTextTrackNum, 55, 44, false }, | 393 { kTextTrackNum, 55, 44, false }, |
| 387 { kVideoTrackNum, 67, 33, true }, | 394 { kVideoTrackNum, 67, 33, true }, |
| 388 }; | 395 }; |
| 389 int input_block_count = arraysize(kInputBlockInfo); | 396 int input_block_count = arraysize(kInputBlockInfo); |
| 390 | 397 |
| 391 scoped_ptr<Cluster> cluster( | 398 scoped_ptr<Cluster> cluster( |
| 392 CreateCluster(0, kInputBlockInfo, input_block_count)); | 399 CreateCluster(0, kInputBlockInfo, input_block_count)); |
| 393 | 400 |
| 394 int result = parser_->Parse(cluster->data(), cluster->size()); | 401 int result = parser_->Parse(cluster->data(), cluster->size()); |
| 395 EXPECT_EQ(cluster->size(), result); | 402 EXPECT_EQ(cluster->size(), result); |
| 396 ASSERT_TRUE(VerifyBuffers(parser_, kInputBlockInfo, input_block_count)); | 403 ASSERT_TRUE(VerifyBuffers(parser_, kInputBlockInfo, input_block_count)); |
| 397 } | 404 } |
| 398 | 405 |
| 399 TEST_F(WebMClusterParserTest, TextTracksSimpleBlock) { | 406 TEST_F(WebMClusterParserTest, TextTracksSimpleBlock) { |
| 400 std::set<int> text_tracks; | 407 std::set<int> text_tracks; |
| 401 text_tracks.insert(kTextTrackNum); | 408 text_tracks.insert(kTextTrackNum); |
| 402 | 409 |
| 403 parser_.reset(new WebMClusterParser( | 410 parser_.reset(new WebMClusterParser(kTimecodeScale, |
| 404 kTimecodeScale, kAudioTrackNum, kVideoTrackNum, | 411 kAudioTrackNum, |
| 405 text_tracks, | 412 kVideoTrackNum, |
| 406 std::set<int64>(), "", "", | 413 text_tracks, |
| 407 LogCB())); | 414 std::set<int64>(), |
| 415 std::string(), |
| 416 std::string(), |
| 417 LogCB())); |
| 408 | 418 |
| 409 const BlockInfo kInputBlockInfo[] = { | 419 const BlockInfo kInputBlockInfo[] = { |
| 410 { kTextTrackNum, 33, 42, true }, | 420 { kTextTrackNum, 33, 42, true }, |
| 411 }; | 421 }; |
| 412 int input_block_count = arraysize(kInputBlockInfo); | 422 int input_block_count = arraysize(kInputBlockInfo); |
| 413 | 423 |
| 414 scoped_ptr<Cluster> cluster( | 424 scoped_ptr<Cluster> cluster( |
| 415 CreateCluster(0, kInputBlockInfo, input_block_count)); | 425 CreateCluster(0, kInputBlockInfo, input_block_count)); |
| 416 | 426 |
| 417 int result = parser_->Parse(cluster->data(), cluster->size()); | 427 int result = parser_->Parse(cluster->data(), cluster->size()); |
| 418 EXPECT_LT(result, 0); | 428 EXPECT_LT(result, 0); |
| 419 } | 429 } |
| 420 | 430 |
| 421 TEST_F(WebMClusterParserTest, ParseMultipleTextTracks) { | 431 TEST_F(WebMClusterParserTest, ParseMultipleTextTracks) { |
| 422 typedef std::set<int> TextTrackSet; | 432 typedef std::set<int> TextTrackSet; |
| 423 TextTrackSet text_tracks; | 433 TextTrackSet text_tracks; |
| 424 | 434 |
| 425 const int kSubtitleTextTrackNum = kTextTrackNum; | 435 const int kSubtitleTextTrackNum = kTextTrackNum; |
| 426 const int kCaptionTextTrackNum = kTextTrackNum + 1; | 436 const int kCaptionTextTrackNum = kTextTrackNum + 1; |
| 427 | 437 |
| 428 text_tracks.insert(kSubtitleTextTrackNum); | 438 text_tracks.insert(kSubtitleTextTrackNum); |
| 429 text_tracks.insert(kCaptionTextTrackNum); | 439 text_tracks.insert(kCaptionTextTrackNum); |
| 430 | 440 |
| 431 parser_.reset(new WebMClusterParser( | 441 parser_.reset(new WebMClusterParser(kTimecodeScale, |
| 432 kTimecodeScale, kAudioTrackNum, kVideoTrackNum, | 442 kAudioTrackNum, |
| 433 text_tracks, | 443 kVideoTrackNum, |
| 434 std::set<int64>(), "", "", | 444 text_tracks, |
| 435 LogCB())); | 445 std::set<int64>(), |
| 446 std::string(), |
| 447 std::string(), |
| 448 LogCB())); |
| 436 | 449 |
| 437 const BlockInfo kInputBlockInfo[] = { | 450 const BlockInfo kInputBlockInfo[] = { |
| 438 { kAudioTrackNum, 0, 23, true }, | 451 { kAudioTrackNum, 0, 23, true }, |
| 439 { kAudioTrackNum, 23, 23, true }, | 452 { kAudioTrackNum, 23, 23, true }, |
| 440 { kVideoTrackNum, 33, 33, true }, | 453 { kVideoTrackNum, 33, 33, true }, |
| 441 { kSubtitleTextTrackNum, 33, 42, false }, | 454 { kSubtitleTextTrackNum, 33, 42, false }, |
| 442 { kAudioTrackNum, 46, 23, true }, | 455 { kAudioTrackNum, 46, 23, true }, |
| 443 { kCaptionTextTrackNum, 55, 44, false }, | 456 { kCaptionTextTrackNum, 55, 44, false }, |
| 444 { kVideoTrackNum, 67, 33, true }, | 457 { kVideoTrackNum, 67, 33, true }, |
| 445 { kSubtitleTextTrackNum, 67, 33, false }, | 458 { kSubtitleTextTrackNum, 67, 33, false }, |
| (...skipping 17 matching lines...) Expand all Loading... |
| 463 text_tracks.find(text_track_num); | 476 text_tracks.find(text_track_num); |
| 464 ASSERT_TRUE(find_result != text_tracks.end()); | 477 ASSERT_TRUE(find_result != text_tracks.end()); |
| 465 ASSERT_TRUE(VerifyTextBuffers(parser_, kInputBlockInfo, input_block_count, | 478 ASSERT_TRUE(VerifyTextBuffers(parser_, kInputBlockInfo, input_block_count, |
| 466 text_track_num, *text_buffers)); | 479 text_track_num, *text_buffers)); |
| 467 } | 480 } |
| 468 } | 481 } |
| 469 | 482 |
| 470 TEST_F(WebMClusterParserTest, ParseEncryptedBlock) { | 483 TEST_F(WebMClusterParserTest, ParseEncryptedBlock) { |
| 471 scoped_ptr<Cluster> cluster(CreateEncryptedCluster(sizeof(kEncryptedFrame))); | 484 scoped_ptr<Cluster> cluster(CreateEncryptedCluster(sizeof(kEncryptedFrame))); |
| 472 | 485 |
| 473 parser_.reset(new WebMClusterParser( | 486 parser_.reset(new WebMClusterParser(kTimecodeScale, |
| 474 kTimecodeScale, kAudioTrackNum, kVideoTrackNum, | 487 kAudioTrackNum, |
| 475 std::set<int>(), | 488 kVideoTrackNum, |
| 476 std::set<int64>(), "", "video_key_id", | 489 std::set<int>(), |
| 477 LogCB())); | 490 std::set<int64>(), |
| 491 std::string(), |
| 492 "video_key_id", |
| 493 LogCB())); |
| 478 int result = parser_->Parse(cluster->data(), cluster->size()); | 494 int result = parser_->Parse(cluster->data(), cluster->size()); |
| 479 EXPECT_EQ(cluster->size(), result); | 495 EXPECT_EQ(cluster->size(), result); |
| 480 ASSERT_EQ(1UL, parser_->video_buffers().size()); | 496 ASSERT_EQ(1UL, parser_->video_buffers().size()); |
| 481 scoped_refptr<StreamParserBuffer> buffer = parser_->video_buffers()[0]; | 497 scoped_refptr<StreamParserBuffer> buffer = parser_->video_buffers()[0]; |
| 482 EXPECT_TRUE(VerifyEncryptedBuffer(buffer)); | 498 EXPECT_TRUE(VerifyEncryptedBuffer(buffer)); |
| 483 } | 499 } |
| 484 | 500 |
| 485 TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) { | 501 TEST_F(WebMClusterParserTest, ParseBadEncryptedBlock) { |
| 486 scoped_ptr<Cluster> cluster( | 502 scoped_ptr<Cluster> cluster( |
| 487 CreateEncryptedCluster(sizeof(kEncryptedFrame) - 1)); | 503 CreateEncryptedCluster(sizeof(kEncryptedFrame) - 1)); |
| 488 | 504 |
| 489 parser_.reset(new WebMClusterParser( | 505 parser_.reset(new WebMClusterParser(kTimecodeScale, |
| 490 kTimecodeScale, kAudioTrackNum, kVideoTrackNum, | 506 kAudioTrackNum, |
| 491 std::set<int>(), | 507 kVideoTrackNum, |
| 492 std::set<int64>(), "", "video_key_id", | 508 std::set<int>(), |
| 493 LogCB())); | 509 std::set<int64>(), |
| 510 std::string(), |
| 511 "video_key_id", |
| 512 LogCB())); |
| 494 int result = parser_->Parse(cluster->data(), cluster->size()); | 513 int result = parser_->Parse(cluster->data(), cluster->size()); |
| 495 EXPECT_EQ(-1, result); | 514 EXPECT_EQ(-1, result); |
| 496 } | 515 } |
| 497 | 516 |
| 498 } // namespace media | 517 } // namespace media |
| OLD | NEW |