Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(455)

Side by Side Diff: media/filters/chunk_demuxer_unittest.cc

Issue 2076673005: MSE: Plumb ChunkDemuxer appendData failures into append Error algorithm (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed the layout test Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/chunk_demuxer.h" 5 #include "media/filters/chunk_demuxer.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <algorithm> 9 #include <algorithm>
10 #include <utility> 10 #include <utility>
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 codecs.push_back("avc1.640028"); 466 codecs.push_back("avc1.640028");
467 ChunkDemuxer::Status status = demuxer_->AddId(source_id, type, codecs); 467 ChunkDemuxer::Status status = demuxer_->AddId(source_id, type, codecs);
468 if (status == ChunkDemuxer::kOk) 468 if (status == ChunkDemuxer::kOk)
469 demuxer_->SetTracksWatcher( 469 demuxer_->SetTracksWatcher(
470 source_id, base::Bind(&ChunkDemuxerTest::InitSegmentReceived, 470 source_id, base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
471 base::Unretained(this))); 471 base::Unretained(this)));
472 return status; 472 return status;
473 } 473 }
474 #endif 474 #endif
475 475
476 void AppendData(const uint8_t* data, size_t length) { 476 bool AppendData(const uint8_t* data, size_t length) {
477 AppendData(kSourceId, data, length); 477 return AppendData(kSourceId, data, length);
478 } 478 }
479 479
480 void AppendCluster(const std::string& source_id, 480 bool AppendCluster(const std::string& source_id,
481 std::unique_ptr<Cluster> cluster) { 481 std::unique_ptr<Cluster> cluster) {
482 AppendData(source_id, cluster->data(), cluster->size()); 482 return AppendData(source_id, cluster->data(), cluster->size());
483 } 483 }
484 484
485 void AppendCluster(std::unique_ptr<Cluster> cluster) { 485 bool AppendCluster(std::unique_ptr<Cluster> cluster) {
486 AppendCluster(kSourceId, std::move(cluster)); 486 return AppendCluster(kSourceId, std::move(cluster));
487 } 487 }
488 488
489 void AppendCluster(int timecode, int block_count) { 489 bool AppendCluster(int timecode, int block_count) {
490 AppendCluster(GenerateCluster(timecode, block_count)); 490 return AppendCluster(GenerateCluster(timecode, block_count));
491 } 491 }
492 492
493 void AppendSingleStreamCluster(const std::string& source_id, int track_number, 493 void AppendSingleStreamCluster(const std::string& source_id, int track_number,
494 int timecode, int block_count) { 494 int timecode, int block_count) {
495 int block_duration = 0; 495 int block_duration = 0;
496 switch (track_number) { 496 switch (track_number) {
497 case kVideoTrackNum: 497 case kVideoTrackNum:
498 case kAlternateVideoTrackNum: 498 case kAlternateVideoTrackNum:
499 block_duration = kVideoBlockDuration; 499 block_duration = kVideoBlockDuration;
500 break; 500 break;
501 case kAudioTrackNum: 501 case kAudioTrackNum:
502 case kAlternateAudioTrackNum: 502 case kAlternateAudioTrackNum:
503 block_duration = kAudioBlockDuration; 503 block_duration = kAudioBlockDuration;
504 break; 504 break;
505 case kTextTrackNum: // Fall-through. 505 case kTextTrackNum: // Fall-through.
506 case kAlternateTextTrackNum: 506 case kAlternateTextTrackNum:
507 block_duration = kTextBlockDuration; 507 block_duration = kTextBlockDuration;
508 break; 508 break;
509 } 509 }
510 ASSERT_NE(block_duration, 0); 510 ASSERT_NE(block_duration, 0);
511 int end_timecode = timecode + block_count * block_duration; 511 int end_timecode = timecode + block_count * block_duration;
512 AppendCluster(source_id, 512 ASSERT_TRUE(AppendCluster(
513 GenerateSingleStreamCluster( 513 source_id, GenerateSingleStreamCluster(timecode, end_timecode,
514 timecode, end_timecode, track_number, block_duration)); 514 track_number, block_duration)));
515 } 515 }
516 516
517 struct BlockInfo { 517 struct BlockInfo {
518 BlockInfo() 518 BlockInfo()
519 : track_number(0), 519 : track_number(0),
520 timestamp_in_ms(0), 520 timestamp_in_ms(0),
521 flags(0), 521 flags(0),
522 duration(0) { 522 duration(0) {
523 } 523 }
524 524
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 return GenerateCluster(blocks, unknown_size); 643 return GenerateCluster(blocks, unknown_size);
644 } 644 }
645 645
646 // |block_descriptions| - The block descriptions used to construct the 646 // |block_descriptions| - The block descriptions used to construct the
647 // cluster. See the documentation for ParseBlockDescriptions() for details on 647 // cluster. See the documentation for ParseBlockDescriptions() for details on
648 // the string format. 648 // the string format.
649 void AppendSingleStreamCluster(const std::string& source_id, int track_number, 649 void AppendSingleStreamCluster(const std::string& source_id, int track_number,
650 const std::string& block_descriptions) { 650 const std::string& block_descriptions) {
651 std::vector<BlockInfo> blocks; 651 std::vector<BlockInfo> blocks;
652 ParseBlockDescriptions(track_number, block_descriptions, &blocks); 652 ParseBlockDescriptions(track_number, block_descriptions, &blocks);
653 AppendCluster(source_id, GenerateCluster(blocks, false)); 653 ASSERT_TRUE(AppendCluster(source_id, GenerateCluster(blocks, false)));
654 } 654 }
655 655
656 struct MuxedStreamInfo { 656 struct MuxedStreamInfo {
657 MuxedStreamInfo() 657 MuxedStreamInfo()
658 : track_number(0), 658 : track_number(0),
659 block_descriptions(""), 659 block_descriptions(""),
660 last_blocks_estimated_duration(-1) {} 660 last_blocks_estimated_duration(-1) {}
661 661
662 MuxedStreamInfo(int track_num, const char* block_desc) 662 MuxedStreamInfo(int track_num, const char* block_desc)
663 : track_number(track_num), 663 : track_number(track_num),
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
714 714
715 if (msi[i].last_blocks_estimated_duration != -1) { 715 if (msi[i].last_blocks_estimated_duration != -1) {
716 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated( 716 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
717 msi[i].last_blocks_estimated_duration)); 717 msi[i].last_blocks_estimated_duration));
718 } 718 }
719 } 719 }
720 return GenerateCluster(block_queue, false); 720 return GenerateCluster(block_queue, false);
721 } 721 }
722 722
723 void AppendMuxedCluster(const std::vector<MuxedStreamInfo> msi) { 723 void AppendMuxedCluster(const std::vector<MuxedStreamInfo> msi) {
724 AppendCluster(kSourceId, GenerateMuxedCluster(msi)); 724 ASSERT_TRUE(AppendCluster(kSourceId, GenerateMuxedCluster(msi)));
725 } 725 }
726 726
727 void AppendData(const std::string& source_id, 727 bool AppendData(const std::string& source_id,
728 const uint8_t* data, 728 const uint8_t* data,
729 size_t length) { 729 size_t length) {
730 EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber()); 730 EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber());
731 731
732 demuxer_->AppendData( 732 return demuxer_->AppendData(
733 source_id, data, length, append_window_start_for_next_append_, 733 source_id, data, length, append_window_start_for_next_append_,
734 append_window_end_for_next_append_, &timestamp_offset_map_[source_id]); 734 append_window_end_for_next_append_, &timestamp_offset_map_[source_id]);
735 } 735 }
736 736
737 void AppendDataInPieces(const uint8_t* data, size_t length) { 737 bool AppendDataInPieces(const uint8_t* data, size_t length) {
738 AppendDataInPieces(data, length, 7); 738 return AppendDataInPieces(data, length, 7);
739 } 739 }
740 740
741 void AppendDataInPieces(const uint8_t* data, 741 bool AppendDataInPieces(const uint8_t* data,
742 size_t length, 742 size_t length,
743 size_t piece_size) { 743 size_t piece_size) {
744 const uint8_t* start = data; 744 const uint8_t* start = data;
745 const uint8_t* end = data + length; 745 const uint8_t* end = data + length;
746 while (start < end) { 746 while (start < end) {
747 size_t append_size = std::min(piece_size, 747 size_t append_size = std::min(piece_size,
748 static_cast<size_t>(end - start)); 748 static_cast<size_t>(end - start));
749 AppendData(start, append_size); 749 if (!AppendData(start, append_size))
750 return false;
750 start += append_size; 751 start += append_size;
751 } 752 }
753 return true;
752 } 754 }
753 755
754 void AppendInitSegment(int stream_flags) { 756 bool AppendInitSegment(int stream_flags) {
755 AppendInitSegmentWithSourceId(kSourceId, stream_flags); 757 return AppendInitSegmentWithSourceId(kSourceId, stream_flags);
756 } 758 }
757 759
758 void AppendInitSegmentWithSourceId(const std::string& source_id, 760 bool AppendInitSegmentWithSourceId(const std::string& source_id,
759 int stream_flags) { 761 int stream_flags) {
760 AppendInitSegmentWithEncryptedInfo(source_id, stream_flags, false, false); 762 return AppendInitSegmentWithEncryptedInfo(source_id, stream_flags, false,
763 false);
761 } 764 }
762 765
763 void AppendInitSegmentWithEncryptedInfo(const std::string& source_id, 766 bool AppendInitSegmentWithEncryptedInfo(const std::string& source_id,
764 int stream_flags, 767 int stream_flags,
765 bool is_audio_encrypted, 768 bool is_audio_encrypted,
766 bool is_video_encrypted) { 769 bool is_video_encrypted) {
767 std::unique_ptr<uint8_t[]> info_tracks; 770 std::unique_ptr<uint8_t[]> info_tracks;
768 int info_tracks_size = 0; 771 int info_tracks_size = 0;
769 CreateInitSegment(stream_flags, 772 CreateInitSegment(stream_flags,
770 is_audio_encrypted, is_video_encrypted, 773 is_audio_encrypted, is_video_encrypted,
771 &info_tracks, &info_tracks_size); 774 &info_tracks, &info_tracks_size);
772 AppendData(source_id, info_tracks.get(), info_tracks_size); 775 return AppendData(source_id, info_tracks.get(), info_tracks_size);
773 } 776 }
774 777
775 void AppendGarbage() { 778 void AppendGarbage() {
776 // Fill up an array with gibberish. 779 // Fill up an array with gibberish.
777 int garbage_cluster_size = 10; 780 int garbage_cluster_size = 10;
778 std::unique_ptr<uint8_t[]> garbage_cluster( 781 std::unique_ptr<uint8_t[]> garbage_cluster(
779 new uint8_t[garbage_cluster_size]); 782 new uint8_t[garbage_cluster_size]);
780 for (int i = 0; i < garbage_cluster_size; ++i) 783 for (int i = 0; i < garbage_cluster_size; ++i)
781 garbage_cluster[i] = i; 784 garbage_cluster[i] = i;
782 AppendData(garbage_cluster.get(), garbage_cluster_size); 785 ASSERT_FALSE(AppendData(garbage_cluster.get(), garbage_cluster_size));
783 } 786 }
784 787
785 void InitDoneCalled(PipelineStatus expected_status, 788 void InitDoneCalled(PipelineStatus expected_status,
786 PipelineStatus status) { 789 PipelineStatus status) {
787 EXPECT_EQ(status, expected_status); 790 EXPECT_EQ(status, expected_status);
788 } 791 }
789 792
790 PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration, 793 PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration,
791 PipelineStatus expected_status) { 794 PipelineStatus expected_status) {
792 if (expected_duration != kNoTimestamp()) 795 if (expected_duration != kNoTimestamp())
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
862 // OnNewConfigs() requires at least one audio, video, or text track. 865 // OnNewConfigs() requires at least one audio, video, or text track.
863 EXPECT_MEDIA_LOG(StreamParsingFailed()); 866 EXPECT_MEDIA_LOG(StreamParsingFailed());
864 } 867 }
865 868
866 demuxer_->Initialize( 869 demuxer_->Initialize(
867 &host_, CreateInitDoneCB(expected_duration, expected_status), true); 870 &host_, CreateInitDoneCB(expected_duration, expected_status), true);
868 871
869 if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk) 872 if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk)
870 return false; 873 return false;
871 874
872 AppendInitSegmentWithEncryptedInfo( 875 return AppendInitSegmentWithEncryptedInfo(
873 kSourceId, stream_flags, 876 kSourceId, stream_flags, is_audio_encrypted, is_video_encrypted);
874 is_audio_encrypted, is_video_encrypted);
875 return true;
876 } 877 }
877 878
878 bool InitDemuxerAudioAndVideoSourcesText(const std::string& audio_id, 879 bool InitDemuxerAudioAndVideoSourcesText(const std::string& audio_id,
879 const std::string& video_id, 880 const std::string& video_id,
880 bool has_text) { 881 bool has_text) {
881 EXPECT_CALL(*this, DemuxerOpened()); 882 EXPECT_CALL(*this, DemuxerOpened());
882 demuxer_->Initialize( 883 demuxer_->Initialize(
883 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); 884 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
884 885
885 if (AddId(audio_id, HAS_AUDIO) != ChunkDemuxer::kOk) 886 if (AddId(audio_id, HAS_AUDIO) != ChunkDemuxer::kOk)
886 return false; 887 return false;
887 if (AddId(video_id, HAS_VIDEO) != ChunkDemuxer::kOk) 888 if (AddId(video_id, HAS_VIDEO) != ChunkDemuxer::kOk)
888 return false; 889 return false;
889 890
890 int audio_flags = HAS_AUDIO; 891 int audio_flags = HAS_AUDIO;
891 int video_flags = HAS_VIDEO; 892 int video_flags = HAS_VIDEO;
892 893
893 if (has_text) { 894 if (has_text) {
894 audio_flags |= HAS_TEXT; 895 audio_flags |= HAS_TEXT;
895 video_flags |= HAS_TEXT; 896 video_flags |= HAS_TEXT;
896 } 897 }
897 898
898 // Note: Unlike InitDemuxerWithEncryptionInfo, this method is currently 899 // Note: Unlike InitDemuxerWithEncryptionInfo, this method is currently
899 // incompatible with InSequence tests. Refactoring of the duration 900 // incompatible with InSequence tests. Refactoring of the duration
900 // set expectation to not be added during CreateInitDoneCB() could fix this. 901 // set expectation to not be added during CreateInitDoneCB() could fix this.
901 ExpectInitMediaLogs(audio_flags); 902 ExpectInitMediaLogs(audio_flags);
902 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 903 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
903 AppendInitSegmentWithSourceId(audio_id, audio_flags); 904 EXPECT_TRUE(AppendInitSegmentWithSourceId(audio_id, audio_flags));
904 905
905 ExpectInitMediaLogs(video_flags); 906 ExpectInitMediaLogs(video_flags);
906 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 907 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
907 AppendInitSegmentWithSourceId(video_id, video_flags); 908 EXPECT_TRUE(AppendInitSegmentWithSourceId(video_id, video_flags));
908 return true; 909 return true;
909 } 910 }
910 911
911 bool InitDemuxerAudioAndVideoSources(const std::string& audio_id, 912 bool InitDemuxerAudioAndVideoSources(const std::string& audio_id,
912 const std::string& video_id) { 913 const std::string& video_id) {
913 return InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, false); 914 return InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, false);
914 } 915 }
915 916
916 // Initializes the demuxer with data from 2 files with different 917 // Initializes the demuxer with data from 2 files with different
917 // decoder configurations. This is used to test the decoder config change 918 // decoder configurations. This is used to test the decoder config change
(...skipping 27 matching lines...) Expand all
945 PIPELINE_OK), true); 946 PIPELINE_OK), true);
946 947
947 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk) 948 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk)
948 return false; 949 return false;
949 950
950 // Append the whole bear1 file. 951 // Append the whole bear1 file.
951 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7); 952 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)).Times(7);
952 // Expect duration adjustment since actual duration differs slightly from 953 // Expect duration adjustment since actual duration differs slightly from
953 // duration in the init segment. 954 // duration in the init segment.
954 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746))); 955 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746)));
955 AppendData(bear1->data(), bear1->data_size()); 956 EXPECT_TRUE(AppendData(bear1->data(), bear1->data_size()));
956 // Last audio frame has timestamp 2721 and duration 24 (estimated from max 957 // Last audio frame has timestamp 2721 and duration 24 (estimated from max
957 // seen so far for audio track). 958 // seen so far for audio track).
958 // Last video frame has timestamp 2703 and duration 33 (from TrackEntry 959 // Last video frame has timestamp 2703 and duration 33 (from TrackEntry
959 // DefaultDuration for video track). 960 // DefaultDuration for video track).
960 CheckExpectedRanges("{ [0,2736) }"); 961 CheckExpectedRanges("{ [0,2736) }");
961 962
962 // Append initialization segment for bear2. 963 // Append initialization segment for bear2.
963 // Note: Offsets here and below are derived from 964 // Note: Offsets here and below are derived from
964 // media/test/data/bear-640x360-manifest.js and 965 // media/test/data/bear-640x360-manifest.js and
965 // media/test/data/bear-320x240-manifest.js which were 966 // media/test/data/bear-320x240-manifest.js which were
966 // generated from media/test/data/bear-640x360.webm and 967 // generated from media/test/data/bear-640x360.webm and
967 // media/test/data/bear-320x240.webm respectively. 968 // media/test/data/bear-320x240.webm respectively.
968 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 969 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
969 AppendData(bear2->data(), 4340); 970 EXPECT_TRUE(AppendData(bear2->data(), 4340));
970 971
971 // Append a media segment that goes from [0.527000, 1.014000). 972 // Append a media segment that goes from [0.527000, 1.014000).
972 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)); 973 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
973 EXPECT_MEDIA_LOG(GeneratedSplice(20000, 527000)); 974 EXPECT_MEDIA_LOG(GeneratedSplice(20000, 527000));
974 AppendData(bear2->data() + 55290, 18785); 975 EXPECT_TRUE(AppendData(bear2->data() + 55290, 18785));
975 CheckExpectedRanges("{ [0,1027) [1201,2736) }"); 976 CheckExpectedRanges("{ [0,1027) [1201,2736) }");
976 977
977 // Append initialization segment for bear1 & fill gap with [779-1197) 978 // Append initialization segment for bear1 & fill gap with [779-1197)
978 // segment. 979 // segment.
979 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 980 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
980 AppendData(bear1->data(), 4370); 981 EXPECT_TRUE(AppendData(bear1->data(), 4370));
981 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)); 982 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23));
982 EXPECT_MEDIA_LOG(GeneratedSplice(26000, 779000)); 983 EXPECT_MEDIA_LOG(GeneratedSplice(26000, 779000));
983 AppendData(bear1->data() + 72737, 28183); 984 EXPECT_TRUE(AppendData(bear1->data() + 72737, 28183));
984 CheckExpectedRanges("{ [0,2736) }"); 985 CheckExpectedRanges("{ [0,2736) }");
985 986
986 MarkEndOfStream(PIPELINE_OK); 987 MarkEndOfStream(PIPELINE_OK);
987 return true; 988 return true;
988 } 989 }
989 990
990 void ShutdownDemuxer() { 991 void ShutdownDemuxer() {
991 if (demuxer_) { 992 if (demuxer_) {
992 demuxer_->Shutdown(); 993 demuxer_->Shutdown();
993 message_loop_.RunUntilIdle(); 994 message_loop_.RunUntilIdle();
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
1320 EXPECT_CALL(*this, DemuxerOpened()); 1321 EXPECT_CALL(*this, DemuxerOpened());
1321 demuxer_->Initialize( 1322 demuxer_->Initialize(
1322 &host_, CreateInitDoneCB(duration, PIPELINE_OK), true); 1323 &host_, CreateInitDoneCB(duration, PIPELINE_OK), true);
1323 1324
1324 if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk) 1325 if (AddId(kSourceId, stream_flags) != ChunkDemuxer::kOk)
1325 return false; 1326 return false;
1326 1327
1327 // Read a WebM file into memory and send the data to the demuxer. 1328 // Read a WebM file into memory and send the data to the demuxer.
1328 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename); 1329 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile(filename);
1329 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1330 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1330 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); 1331 EXPECT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
1331 1332
1332 // Verify that the timestamps on the first few packets match what we 1333 // Verify that the timestamps on the first few packets match what we
1333 // expect. 1334 // expect.
1334 for (size_t i = 0; 1335 for (size_t i = 0;
1335 (timestamps[i].audio_time_ms != kSkip || 1336 (timestamps[i].audio_time_ms != kSkip ||
1336 timestamps[i].video_time_ms != kSkip); 1337 timestamps[i].video_time_ms != kSkip);
1337 i++) { 1338 i++) {
1338 bool audio_read_done = false; 1339 bool audio_read_done = false;
1339 bool video_read_done = false; 1340 bool video_read_done = false;
1340 1341
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1431 1432
1432 CreateNewDemuxer(); 1433 CreateNewDemuxer();
1433 1434
1434 int stream_flags = 0; 1435 int stream_flags = 0;
1435 if (has_audio) 1436 if (has_audio)
1436 stream_flags |= HAS_AUDIO; 1437 stream_flags |= HAS_AUDIO;
1437 1438
1438 if (has_video) 1439 if (has_video)
1439 stream_flags |= HAS_VIDEO; 1440 stream_flags |= HAS_VIDEO;
1440 1441
1441 ASSERT_TRUE(InitDemuxerWithEncryptionInfo( 1442 if (has_audio || has_video) {
1442 stream_flags, is_audio_encrypted, is_video_encrypted)); 1443 ASSERT_TRUE(InitDemuxerWithEncryptionInfo(
1444 stream_flags, is_audio_encrypted, is_video_encrypted));
1445 } else {
1446 ASSERT_FALSE(InitDemuxerWithEncryptionInfo(
1447 stream_flags, is_audio_encrypted, is_video_encrypted));
1448 }
1443 1449
1444 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1450 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
1445 if (has_audio) { 1451 if (has_audio) {
1446 ASSERT_TRUE(audio_stream); 1452 ASSERT_TRUE(audio_stream);
1447 1453
1448 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); 1454 const AudioDecoderConfig& config = audio_stream->audio_decoder_config();
1449 EXPECT_EQ(kCodecVorbis, config.codec()); 1455 EXPECT_EQ(kCodecVorbis, config.codec());
1450 EXPECT_EQ(32, config.bits_per_channel()); 1456 EXPECT_EQ(32, config.bits_per_channel());
1451 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout()); 1457 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout());
1452 EXPECT_EQ(44100, config.samples_per_second()); 1458 EXPECT_EQ(44100, config.samples_per_second());
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1567 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30), 1573 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30),
1568 MuxedStreamInfo(kTextTrackNum, "10K")); 1574 MuxedStreamInfo(kTextTrackNum, "10K"));
1569 CheckExpectedRanges("{ [0,46) }"); 1575 CheckExpectedRanges("{ [0,46) }");
1570 1576
1571 std::unique_ptr<uint8_t[]> info_tracks; 1577 std::unique_ptr<uint8_t[]> info_tracks;
1572 int info_tracks_size = 0; 1578 int info_tracks_size = 0;
1573 CreateInitSegment( 1579 CreateInitSegment(
1574 HAS_TEXT | HAS_AUDIO | HAS_VIDEO | USE_ALTERNATE_TEXT_TRACK_ID, false, 1580 HAS_TEXT | HAS_AUDIO | HAS_VIDEO | USE_ALTERNATE_TEXT_TRACK_ID, false,
1575 false, &info_tracks, &info_tracks_size); 1581 false, &info_tracks, &info_tracks_size);
1576 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1582 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1577 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, 1583 ASSERT_TRUE(demuxer_->AppendData(
1578 append_window_start_for_next_append_, 1584 kSourceId, info_tracks.get(), info_tracks_size,
1579 append_window_end_for_next_append_, 1585 append_window_start_for_next_append_, append_window_end_for_next_append_,
1580 &timestamp_offset_map_[kSourceId]); 1586 &timestamp_offset_map_[kSourceId]));
1581 1587
1582 AppendMuxedCluster( 1588 AppendMuxedCluster(
1583 MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23), 1589 MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
1584 MuxedStreamInfo(kVideoTrackNum, "60K", 1590 MuxedStreamInfo(kVideoTrackNum, "60K",
1585 WebMClusterParser::kDefaultVideoBufferDurationInMs), 1591 WebMClusterParser::kDefaultVideoBufferDurationInMs),
1586 MuxedStreamInfo(kAlternateTextTrackNum, "45K")); 1592 MuxedStreamInfo(kAlternateTextTrackNum, "45K"));
1587 1593
1588 CheckExpectedRanges("{ [0,92) }"); 1594 CheckExpectedRanges("{ [0,92) }");
1589 CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K"); 1595 CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K");
1590 CheckExpectedBuffers(video_stream, "0K 30 60K"); 1596 CheckExpectedBuffers(video_stream, "0K 30 60K");
(...skipping 12 matching lines...) Expand all
1603 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1609 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
1604 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1610 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
1605 ASSERT_TRUE(audio_stream); 1611 ASSERT_TRUE(audio_stream);
1606 ASSERT_TRUE(video_stream); 1612 ASSERT_TRUE(video_stream);
1607 1613
1608 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23), 1614 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
1609 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30)); 1615 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30));
1610 CheckExpectedRanges("{ [0,46) }"); 1616 CheckExpectedRanges("{ [0,46) }");
1611 1617
1612 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1618 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1613 AppendInitSegment(HAS_AUDIO | HAS_VIDEO | USE_ALTERNATE_AUDIO_TRACK_ID | 1619 ASSERT_TRUE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO |
1614 USE_ALTERNATE_VIDEO_TRACK_ID); 1620 USE_ALTERNATE_AUDIO_TRACK_ID |
1621 USE_ALTERNATE_VIDEO_TRACK_ID));
1615 AppendMuxedCluster(MuxedStreamInfo(kAlternateAudioTrackNum, "46K 69K", 63), 1622 AppendMuxedCluster(MuxedStreamInfo(kAlternateAudioTrackNum, "46K 69K", 63),
1616 MuxedStreamInfo(kAlternateVideoTrackNum, "60K", 23)); 1623 MuxedStreamInfo(kAlternateVideoTrackNum, "60K", 23));
1617 CheckExpectedRanges("{ [0,92) }"); 1624 CheckExpectedRanges("{ [0,92) }");
1618 CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K"); 1625 CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K");
1619 CheckExpectedBuffers(video_stream, "0K 30 60K"); 1626 CheckExpectedBuffers(video_stream, "0K 30 60K");
1620 1627
1621 ShutdownDemuxer(); 1628 ShutdownDemuxer();
1622 } 1629 }
1623 1630
1624 TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) { 1631 TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) {
(...skipping 14 matching lines...) Expand all
1639 ASSERT_TRUE(audio_stream && video_stream && text_stream); 1646 ASSERT_TRUE(audio_stream && video_stream && text_stream);
1640 1647
1641 AppendMuxedCluster( 1648 AppendMuxedCluster(
1642 MuxedStreamInfo(kAudioTrackNum, "23K", 1649 MuxedStreamInfo(kAudioTrackNum, "23K",
1643 WebMClusterParser::kDefaultAudioBufferDurationInMs), 1650 WebMClusterParser::kDefaultAudioBufferDurationInMs),
1644 MuxedStreamInfo(kVideoTrackNum, "0 30K", 30), 1651 MuxedStreamInfo(kVideoTrackNum, "0 30K", 30),
1645 MuxedStreamInfo(kTextTrackNum, "25K 40K")); 1652 MuxedStreamInfo(kTextTrackNum, "25K 40K"));
1646 CheckExpectedRanges("{ [23,46) }"); 1653 CheckExpectedRanges("{ [23,46) }");
1647 1654
1648 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1655 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1649 AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO); 1656 ASSERT_TRUE(AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO));
1650 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23), 1657 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
1651 MuxedStreamInfo(kVideoTrackNum, "60 90K", 30), 1658 MuxedStreamInfo(kVideoTrackNum, "60 90K", 30),
1652 MuxedStreamInfo(kTextTrackNum, "80K 90K")); 1659 MuxedStreamInfo(kTextTrackNum, "80K 90K"));
1653 CheckExpectedRanges("{ [23,92) }"); 1660 CheckExpectedRanges("{ [23,92) }");
1654 1661
1655 CheckExpectedBuffers(audio_stream, "23K 46K 69K"); 1662 CheckExpectedBuffers(audio_stream, "23K 46K 69K");
1656 CheckExpectedBuffers(video_stream, "30K 90K"); 1663 CheckExpectedBuffers(video_stream, "30K 90K");
1657 CheckExpectedBuffers(text_stream, "25K 40K 80K 90K"); 1664 CheckExpectedBuffers(text_stream, "25K 40K 80K 90K");
1658 } 1665 }
1659 1666
1660 // Make sure that the demuxer reports an error if Shutdown() 1667 // Make sure that the demuxer reports an error if Shutdown()
1661 // is called before all the initialization segments are appended. 1668 // is called before all the initialization segments are appended.
1662 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) { 1669 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) {
1663 EXPECT_CALL(*this, DemuxerOpened()); 1670 EXPECT_CALL(*this, DemuxerOpened());
1664 demuxer_->Initialize( 1671 demuxer_->Initialize(
1665 &host_, CreateInitDoneCB( 1672 &host_, CreateInitDoneCB(
1666 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); 1673 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true);
1667 1674
1668 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); 1675 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
1669 EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk); 1676 EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk);
1670 1677
1671 ExpectInitMediaLogs(HAS_AUDIO); 1678 ExpectInitMediaLogs(HAS_AUDIO);
1672 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1679 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1673 AppendInitSegmentWithSourceId("audio", HAS_AUDIO); 1680 ASSERT_TRUE(AppendInitSegmentWithSourceId("audio", HAS_AUDIO));
1674 1681
1675 ShutdownDemuxer(); 1682 ShutdownDemuxer();
1676 } 1683 }
1677 1684
1678 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) { 1685 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) {
1679 EXPECT_CALL(*this, DemuxerOpened()); 1686 EXPECT_CALL(*this, DemuxerOpened());
1680 demuxer_->Initialize( 1687 demuxer_->Initialize(
1681 &host_, CreateInitDoneCB( 1688 &host_, CreateInitDoneCB(
1682 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); 1689 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true);
1683 1690
1684 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); 1691 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
1685 EXPECT_EQ(AddId("video_and_text", HAS_VIDEO), ChunkDemuxer::kOk); 1692 EXPECT_EQ(AddId("video_and_text", HAS_VIDEO), ChunkDemuxer::kOk);
1686 1693
1687 EXPECT_CALL(host_, AddTextStream(_, _)) 1694 EXPECT_CALL(host_, AddTextStream(_, _))
1688 .Times(Exactly(1)); 1695 .Times(Exactly(1));
1689 1696
1690 ExpectInitMediaLogs(HAS_VIDEO); 1697 ExpectInitMediaLogs(HAS_VIDEO);
1691 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1698 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1692 AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT); 1699 ASSERT_TRUE(
1700 AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT));
1693 1701
1694 ShutdownDemuxer(); 1702 ShutdownDemuxer();
1695 } 1703 }
1696 1704
1697 // Verifies that all streams waiting for data receive an end of stream 1705 // Verifies that all streams waiting for data receive an end of stream
1698 // buffer when Shutdown() is called. 1706 // buffer when Shutdown() is called.
1699 TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) { 1707 TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) {
1700 DemuxerStream* text_stream = NULL; 1708 DemuxerStream* text_stream = NULL;
1701 EXPECT_CALL(host_, AddTextStream(_, _)) 1709 EXPECT_CALL(host_, AddTextStream(_, _))
1702 .WillOnce(SaveArg<0>(&text_stream)); 1710 .WillOnce(SaveArg<0>(&text_stream));
(...skipping 18 matching lines...) Expand all
1721 1729
1722 EXPECT_TRUE(audio_read_done); 1730 EXPECT_TRUE(audio_read_done);
1723 EXPECT_TRUE(video_read_done); 1731 EXPECT_TRUE(video_read_done);
1724 EXPECT_TRUE(text_read_done); 1732 EXPECT_TRUE(text_read_done);
1725 } 1733 }
1726 1734
1727 // Test that Seek() completes successfully when the first cluster 1735 // Test that Seek() completes successfully when the first cluster
1728 // arrives. 1736 // arrives.
1729 TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) { 1737 TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) {
1730 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1738 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1731 AppendCluster(kDefaultFirstCluster()); 1739 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1732 1740
1733 InSequence s; 1741 InSequence s;
1734 1742
1735 EXPECT_CALL(*this, Checkpoint(1)); 1743 EXPECT_CALL(*this, Checkpoint(1));
1736 1744
1737 Seek(base::TimeDelta::FromMilliseconds(46)); 1745 Seek(base::TimeDelta::FromMilliseconds(46));
1738 1746
1739 EXPECT_CALL(*this, Checkpoint(2)); 1747 EXPECT_CALL(*this, Checkpoint(2));
1740 1748
1741 Checkpoint(1); 1749 Checkpoint(1);
1742 1750
1743 AppendCluster(kDefaultSecondCluster()); 1751 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
1744 1752
1745 message_loop_.RunUntilIdle(); 1753 message_loop_.RunUntilIdle();
1746 1754
1747 Checkpoint(2); 1755 Checkpoint(2);
1748 } 1756 }
1749 1757
1750 // Test that parsing errors are handled for clusters appended after init. 1758 // Test that parsing errors are handled for clusters appended after init.
1751 TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) { 1759 TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) {
1752 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1760 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1753 AppendCluster(kDefaultFirstCluster()); 1761 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1754 1762
1755 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1763 EXPECT_MEDIA_LOG(StreamParsingFailed());
1756 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED)); 1764 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
1757 AppendGarbage(); 1765 AppendGarbage();
1758 } 1766 }
1759 1767
1760 // Test the case where a Seek() is requested while the parser 1768 // Test the case where a Seek() is requested while the parser
1761 // is in the middle of cluster. This is to verify that the parser 1769 // is in the middle of cluster. This is to verify that the parser
1762 // does not reset itself on a seek. 1770 // does not reset itself on a seek.
1763 TEST_F(ChunkDemuxerTest, SeekWhileParsingCluster) { 1771 TEST_F(ChunkDemuxerTest, SeekWhileParsingCluster) {
1764 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1772 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1765 1773
1766 InSequence s; 1774 InSequence s;
1767 1775
1768 std::unique_ptr<Cluster> cluster_a(GenerateCluster(0, 6)); 1776 std::unique_ptr<Cluster> cluster_a(GenerateCluster(0, 6));
1769 1777
1770 // Split the cluster into two appends at an arbitrary point near the end. 1778 // Split the cluster into two appends at an arbitrary point near the end.
1771 int first_append_size = cluster_a->size() - 11; 1779 int first_append_size = cluster_a->size() - 11;
1772 int second_append_size = cluster_a->size() - first_append_size; 1780 int second_append_size = cluster_a->size() - first_append_size;
1773 1781
1774 // Append the first part of the cluster. 1782 // Append the first part of the cluster.
1775 AppendData(cluster_a->data(), first_append_size); 1783 ASSERT_TRUE(AppendData(cluster_a->data(), first_append_size));
1776 1784
1777 ExpectRead(DemuxerStream::AUDIO, 0); 1785 ExpectRead(DemuxerStream::AUDIO, 0);
1778 ExpectRead(DemuxerStream::VIDEO, 0); 1786 ExpectRead(DemuxerStream::VIDEO, 0);
1779 ExpectRead(DemuxerStream::AUDIO, kAudioBlockDuration); 1787 ExpectRead(DemuxerStream::AUDIO, kAudioBlockDuration);
1780 1788
1781 Seek(base::TimeDelta::FromSeconds(5)); 1789 Seek(base::TimeDelta::FromSeconds(5));
1782 1790
1783 // Append the rest of the cluster. 1791 // Append the rest of the cluster.
1784 AppendData(cluster_a->data() + first_append_size, second_append_size); 1792 ASSERT_TRUE(
1793 AppendData(cluster_a->data() + first_append_size, second_append_size));
1785 1794
1786 // Append the new cluster and verify that only the blocks 1795 // Append the new cluster and verify that only the blocks
1787 // in the new cluster are returned. 1796 // in the new cluster are returned.
1788 AppendCluster(GenerateCluster(5000, 6)); 1797 ASSERT_TRUE(AppendCluster(GenerateCluster(5000, 6)));
1789 GenerateExpectedReads(5000, 6); 1798 GenerateExpectedReads(5000, 6);
1790 } 1799 }
1791 1800
1792 // Test the case where AppendData() is called before Init(). 1801 // Test the case where AppendData() is called before Init().
1793 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) { 1802 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) {
1794 std::unique_ptr<uint8_t[]> info_tracks; 1803 std::unique_ptr<uint8_t[]> info_tracks;
1795 int info_tracks_size = 0; 1804 int info_tracks_size = 0;
1796 CreateInitSegment(HAS_AUDIO | HAS_VIDEO, 1805 CreateInitSegment(HAS_AUDIO | HAS_VIDEO,
1797 false, false, &info_tracks, &info_tracks_size); 1806 false, false, &info_tracks, &info_tracks_size);
1798 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, 1807 ASSERT_FALSE(demuxer_->AppendData(
1799 append_window_start_for_next_append_, 1808 kSourceId, info_tracks.get(), info_tracks_size,
1800 append_window_end_for_next_append_, 1809 append_window_start_for_next_append_, append_window_end_for_next_append_,
1801 &timestamp_offset_map_[kSourceId]); 1810 &timestamp_offset_map_[kSourceId]));
1802 } 1811 }
1803 1812
1804 // Make sure Read() callbacks are dispatched with the proper data. 1813 // Make sure Read() callbacks are dispatched with the proper data.
1805 TEST_F(ChunkDemuxerTest, Read) { 1814 TEST_F(ChunkDemuxerTest, Read) {
1806 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1815 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1807 1816
1808 AppendCluster(kDefaultFirstCluster()); 1817 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1809 1818
1810 bool audio_read_done = false; 1819 bool audio_read_done = false;
1811 bool video_read_done = false; 1820 bool video_read_done = false;
1812 ReadAudio(base::Bind(&OnReadDone, 1821 ReadAudio(base::Bind(&OnReadDone,
1813 base::TimeDelta::FromMilliseconds(0), 1822 base::TimeDelta::FromMilliseconds(0),
1814 &audio_read_done)); 1823 &audio_read_done));
1815 ReadVideo(base::Bind(&OnReadDone, 1824 ReadVideo(base::Bind(&OnReadDone,
1816 base::TimeDelta::FromMilliseconds(0), 1825 base::TimeDelta::FromMilliseconds(0),
1817 &video_read_done)); 1826 &video_read_done));
1818 1827
1819 EXPECT_TRUE(audio_read_done); 1828 EXPECT_TRUE(audio_read_done);
1820 EXPECT_TRUE(video_read_done); 1829 EXPECT_TRUE(video_read_done);
1821 } 1830 }
1822 1831
1823 TEST_F(ChunkDemuxerTest, OutOfOrderClusters) { 1832 TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
1824 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1833 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1825 AppendCluster(kDefaultFirstCluster()); 1834 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1826 EXPECT_MEDIA_LOG(GeneratedSplice(13000, 10000)); 1835 EXPECT_MEDIA_LOG(GeneratedSplice(13000, 10000));
1827 AppendCluster(GenerateCluster(10, 4)); 1836 ASSERT_TRUE(AppendCluster(GenerateCluster(10, 4)));
1828 1837
1829 // Make sure that AppendCluster() does not fail with a cluster that has 1838 // Make sure that AppendCluster() does not fail with a cluster that has
1830 // overlaps with the previously appended cluster. 1839 // overlaps with the previously appended cluster.
1831 EXPECT_MEDIA_LOG(SkippingSpliceAlreadySpliced(0)); 1840 EXPECT_MEDIA_LOG(SkippingSpliceAlreadySpliced(0));
1832 AppendCluster(GenerateCluster(5, 4)); 1841 ASSERT_TRUE(AppendCluster(GenerateCluster(5, 4)));
1833 1842
1834 // Verify that AppendData() can still accept more data. 1843 // Verify that AppendData() can still accept more data.
1835 std::unique_ptr<Cluster> cluster_c(GenerateCluster(45, 2)); 1844 std::unique_ptr<Cluster> cluster_c(GenerateCluster(45, 2));
1836 EXPECT_MEDIA_LOG(GeneratedSplice(6000, 45000)); 1845 EXPECT_MEDIA_LOG(GeneratedSplice(6000, 45000));
1837 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(), 1846 ASSERT_TRUE(demuxer_->AppendData(
1838 append_window_start_for_next_append_, 1847 kSourceId, cluster_c->data(), cluster_c->size(),
1839 append_window_end_for_next_append_, 1848 append_window_start_for_next_append_, append_window_end_for_next_append_,
1840 &timestamp_offset_map_[kSourceId]); 1849 &timestamp_offset_map_[kSourceId]));
1841 } 1850 }
1842 1851
1843 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { 1852 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
1844 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1853 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1845 AppendCluster(kDefaultFirstCluster()); 1854 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1846 1855
1847 ClusterBuilder cb; 1856 ClusterBuilder cb;
1848 1857
1849 // Test the case where block timecodes are not monotonically 1858 // Test the case where block timecodes are not monotonically
1850 // increasing but stay above the cluster timecode. 1859 // increasing but stay above the cluster timecode.
1851 cb.SetClusterTimecode(5); 1860 cb.SetClusterTimecode(5);
1852 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1861 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1853 AddSimpleBlock(&cb, kVideoTrackNum, 10); 1862 AddSimpleBlock(&cb, kVideoTrackNum, 10);
1854 AddSimpleBlock(&cb, kAudioTrackNum, 7); 1863 AddSimpleBlock(&cb, kAudioTrackNum, 7);
1855 AddSimpleBlock(&cb, kVideoTrackNum, 15); 1864 AddSimpleBlock(&cb, kVideoTrackNum, 15);
1856 1865
1857 EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode()); 1866 EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode());
1858 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1867 EXPECT_MEDIA_LOG(StreamParsingFailed());
1859 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED)); 1868 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
1860 AppendCluster(cb.Finish()); 1869 ASSERT_FALSE(AppendCluster(cb.Finish()));
1861 1870
1862 // Verify that AppendData() ignores data after the error. 1871 // Verify that AppendData() ignores data after the error.
1863 std::unique_ptr<Cluster> cluster_b(GenerateCluster(20, 2)); 1872 std::unique_ptr<Cluster> cluster_b(GenerateCluster(20, 2));
1864 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), 1873 ASSERT_FALSE(demuxer_->AppendData(
1865 append_window_start_for_next_append_, 1874 kSourceId, cluster_b->data(), cluster_b->size(),
1866 append_window_end_for_next_append_, 1875 append_window_start_for_next_append_, append_window_end_for_next_append_,
1867 &timestamp_offset_map_[kSourceId]); 1876 &timestamp_offset_map_[kSourceId]));
1868 } 1877 }
1869 1878
1870 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { 1879 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
1871 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1880 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1872 AppendCluster(kDefaultFirstCluster()); 1881 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1873 1882
1874 ClusterBuilder cb; 1883 ClusterBuilder cb;
1875 1884
1876 // Test timecodes going backwards and including values less than the cluster 1885 // Test timecodes going backwards and including values less than the cluster
1877 // timecode. 1886 // timecode.
1878 cb.SetClusterTimecode(5); 1887 cb.SetClusterTimecode(5);
1879 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1888 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1880 AddSimpleBlock(&cb, kVideoTrackNum, 5); 1889 AddSimpleBlock(&cb, kVideoTrackNum, 5);
1881 AddSimpleBlock(&cb, kAudioTrackNum, 3); 1890 AddSimpleBlock(&cb, kAudioTrackNum, 3);
1882 AddSimpleBlock(&cb, kVideoTrackNum, 3); 1891 AddSimpleBlock(&cb, kVideoTrackNum, 3);
1883 1892
1884 EXPECT_MEDIA_LOG(WebMNegativeTimecodeOffset("-2")); 1893 EXPECT_MEDIA_LOG(WebMNegativeTimecodeOffset("-2"));
1885 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1894 EXPECT_MEDIA_LOG(StreamParsingFailed());
1886 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED)); 1895 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
1887 AppendCluster(cb.Finish()); 1896 ASSERT_FALSE(AppendCluster(cb.Finish()));
1888 1897
1889 // Verify that AppendData() ignores data after the error. 1898 // Verify that AppendData() ignores data after the error.
1890 std::unique_ptr<Cluster> cluster_b(GenerateCluster(6, 2)); 1899 std::unique_ptr<Cluster> cluster_b(GenerateCluster(6, 2));
1891 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), 1900 ASSERT_FALSE(demuxer_->AppendData(
1892 append_window_start_for_next_append_, 1901 kSourceId, cluster_b->data(), cluster_b->size(),
1893 append_window_end_for_next_append_, 1902 append_window_start_for_next_append_, append_window_end_for_next_append_,
1894 &timestamp_offset_map_[kSourceId]); 1903 &timestamp_offset_map_[kSourceId]));
1895 } 1904 }
1896 1905
1897 1906
1898 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { 1907 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) {
1899 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1908 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1900 AppendCluster(kDefaultFirstCluster()); 1909 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1901 1910
1902 ClusterBuilder cb; 1911 ClusterBuilder cb;
1903 1912
1904 // Test monotonic increasing timestamps on a per stream 1913 // Test monotonic increasing timestamps on a per stream
1905 // basis. 1914 // basis.
1906 cb.SetClusterTimecode(4); 1915 cb.SetClusterTimecode(4);
1907 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1916 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1908 AddSimpleBlock(&cb, kVideoTrackNum, 5); 1917 AddSimpleBlock(&cb, kVideoTrackNum, 5);
1909 AddSimpleBlock(&cb, kAudioTrackNum, 4); 1918 AddSimpleBlock(&cb, kAudioTrackNum, 4);
1910 AddSimpleBlock(&cb, kVideoTrackNum, 7); 1919 AddSimpleBlock(&cb, kVideoTrackNum, 7);
1911 1920
1912 EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode()); 1921 EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode());
1913 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1922 EXPECT_MEDIA_LOG(StreamParsingFailed());
1914 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED)); 1923 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
1915 AppendCluster(cb.Finish()); 1924 ASSERT_FALSE(AppendCluster(cb.Finish()));
1916 } 1925 }
1917 1926
1918 // Test the case where a cluster is passed to AppendCluster() before 1927 // Test the case where a cluster is passed to AppendCluster() before
1919 // INFO & TRACKS data. 1928 // INFO & TRACKS data.
1920 TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) { 1929 TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) {
1921 EXPECT_CALL(*this, DemuxerOpened()); 1930 EXPECT_CALL(*this, DemuxerOpened());
1922 demuxer_->Initialize( 1931 demuxer_->Initialize(
1923 &host_, NewExpectedStatusCB(CHUNK_DEMUXER_ERROR_APPEND_FAILED), true); 1932 &host_, NewExpectedStatusCB(CHUNK_DEMUXER_ERROR_APPEND_FAILED), true);
1924 1933
1925 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1934 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1926 1935
1927 EXPECT_MEDIA_LOG(WebMClusterBeforeFirstInfo()); 1936 EXPECT_MEDIA_LOG(WebMClusterBeforeFirstInfo());
1928 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1937 EXPECT_MEDIA_LOG(StreamParsingFailed());
1929 AppendCluster(GenerateCluster(0, 1)); 1938 ASSERT_FALSE(AppendCluster(GenerateCluster(0, 1)));
1930 } 1939 }
1931 1940
1932 // Test cases where we get an MarkEndOfStream() call during initialization. 1941 // Test cases where we get an MarkEndOfStream() call during initialization.
1933 TEST_F(ChunkDemuxerTest, EOSDuringInit) { 1942 TEST_F(ChunkDemuxerTest, EOSDuringInit) {
1934 EXPECT_CALL(*this, DemuxerOpened()); 1943 EXPECT_CALL(*this, DemuxerOpened());
1935 demuxer_->Initialize( 1944 demuxer_->Initialize(
1936 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); 1945 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
1937 MarkEndOfStream(PIPELINE_OK); 1946 MarkEndOfStream(PIPELINE_OK);
1938 } 1947 }
1939 1948
(...skipping 16 matching lines...) Expand all
1956 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1965 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1957 1966
1958 CheckExpectedRanges("{ }"); 1967 CheckExpectedRanges("{ }");
1959 MarkEndOfStream(PIPELINE_OK); 1968 MarkEndOfStream(PIPELINE_OK);
1960 CheckExpectedRanges("{ }"); 1969 CheckExpectedRanges("{ }");
1961 } 1970 }
1962 1971
1963 TEST_F(ChunkDemuxerTest, DecodeErrorEndOfStream) { 1972 TEST_F(ChunkDemuxerTest, DecodeErrorEndOfStream) {
1964 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1973 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1965 1974
1966 AppendCluster(kDefaultFirstCluster()); 1975 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1967 CheckExpectedRanges(kDefaultFirstClusterRange); 1976 CheckExpectedRanges(kDefaultFirstClusterRange);
1968 1977
1969 EXPECT_CALL(host_, 1978 EXPECT_CALL(host_,
1970 OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR)); 1979 OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR));
1971 MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR); 1980 MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR);
1972 CheckExpectedRanges(kDefaultFirstClusterRange); 1981 CheckExpectedRanges(kDefaultFirstClusterRange);
1973 } 1982 }
1974 1983
1975 TEST_F(ChunkDemuxerTest, NetworkErrorEndOfStream) { 1984 TEST_F(ChunkDemuxerTest, NetworkErrorEndOfStream) {
1976 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1985 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1977 1986
1978 AppendCluster(kDefaultFirstCluster()); 1987 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1979 CheckExpectedRanges(kDefaultFirstClusterRange); 1988 CheckExpectedRanges(kDefaultFirstClusterRange);
1980 1989
1981 EXPECT_CALL(host_, 1990 EXPECT_CALL(host_,
1982 OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR)); 1991 OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR));
1983 MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR); 1992 MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR);
1984 } 1993 }
1985 1994
1986 // Helper class to reduce duplicate code when testing end of stream 1995 // Helper class to reduce duplicate code when testing end of stream
1987 // Read() behavior. 1996 // Read() behavior.
1988 class EndOfStreamHelper { 1997 class EndOfStreamHelper {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2029 bool video_read_done_; 2038 bool video_read_done_;
2030 2039
2031 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); 2040 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper);
2032 }; 2041 };
2033 2042
2034 // Make sure that all pending reads that we don't have media data for get an 2043 // Make sure that all pending reads that we don't have media data for get an
2035 // "end of stream" buffer when MarkEndOfStream() is called. 2044 // "end of stream" buffer when MarkEndOfStream() is called.
2036 TEST_F(ChunkDemuxerTest, EndOfStreamWithPendingReads) { 2045 TEST_F(ChunkDemuxerTest, EndOfStreamWithPendingReads) {
2037 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2046 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2038 2047
2039 AppendCluster(GenerateCluster(0, 2)); 2048 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 2)));
2040 2049
2041 bool audio_read_done_1 = false; 2050 bool audio_read_done_1 = false;
2042 bool video_read_done_1 = false; 2051 bool video_read_done_1 = false;
2043 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 2052 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
2044 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 2053 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
2045 2054
2046 ReadAudio(base::Bind(&OnReadDone, 2055 ReadAudio(base::Bind(&OnReadDone,
2047 base::TimeDelta::FromMilliseconds(0), 2056 base::TimeDelta::FromMilliseconds(0),
2048 &audio_read_done_1)); 2057 &audio_read_done_1));
2049 ReadVideo(base::Bind(&OnReadDone, 2058 ReadVideo(base::Bind(&OnReadDone,
(...skipping 14 matching lines...) Expand all
2064 2073
2065 end_of_stream_helper_2.RequestReads(); 2074 end_of_stream_helper_2.RequestReads();
2066 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 2075 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
2067 } 2076 }
2068 2077
2069 // Make sure that all Read() calls after we get an MarkEndOfStream() 2078 // Make sure that all Read() calls after we get an MarkEndOfStream()
2070 // call return an "end of stream" buffer. 2079 // call return an "end of stream" buffer.
2071 TEST_F(ChunkDemuxerTest, ReadsAfterEndOfStream) { 2080 TEST_F(ChunkDemuxerTest, ReadsAfterEndOfStream) {
2072 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2081 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2073 2082
2074 AppendCluster(GenerateCluster(0, 2)); 2083 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 2)));
2075 2084
2076 bool audio_read_done_1 = false; 2085 bool audio_read_done_1 = false;
2077 bool video_read_done_1 = false; 2086 bool video_read_done_1 = false;
2078 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 2087 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
2079 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 2088 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
2080 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get()); 2089 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get());
2081 2090
2082 ReadAudio(base::Bind(&OnReadDone, 2091 ReadAudio(base::Bind(&OnReadDone,
2083 base::TimeDelta::FromMilliseconds(0), 2092 base::TimeDelta::FromMilliseconds(0),
2084 &audio_read_done_1)); 2093 &audio_read_done_1));
(...skipping 18 matching lines...) Expand all
2103 end_of_stream_helper_2.RequestReads(); 2112 end_of_stream_helper_2.RequestReads();
2104 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 2113 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
2105 2114
2106 end_of_stream_helper_3.RequestReads(); 2115 end_of_stream_helper_3.RequestReads();
2107 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); 2116 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true);
2108 } 2117 }
2109 2118
2110 TEST_F(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) { 2119 TEST_F(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) {
2111 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2120 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2112 2121
2113 AppendCluster(0, 10); 2122 ASSERT_TRUE(AppendCluster(0, 10));
2114 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138))); 2123 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138)));
2115 MarkEndOfStream(PIPELINE_OK); 2124 MarkEndOfStream(PIPELINE_OK);
2116 2125
2117 // Start the first seek. 2126 // Start the first seek.
2118 Seek(base::TimeDelta::FromMilliseconds(20)); 2127 Seek(base::TimeDelta::FromMilliseconds(20));
2119 2128
2120 // Simulate another seek being requested before the first 2129 // Simulate another seek being requested before the first
2121 // seek has finished prerolling. 2130 // seek has finished prerolling.
2122 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(30); 2131 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(30);
2123 demuxer_->CancelPendingSeek(seek_time2); 2132 demuxer_->CancelPendingSeek(seek_time2);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
2202 dst += info_tracks_size; 2211 dst += info_tracks_size;
2203 2212
2204 memcpy(dst, cluster_a->data(), cluster_a->size()); 2213 memcpy(dst, cluster_a->data(), cluster_a->size());
2205 dst += cluster_a->size(); 2214 dst += cluster_a->size();
2206 2215
2207 memcpy(dst, cluster_b->data(), cluster_b->size()); 2216 memcpy(dst, cluster_b->data(), cluster_b->size());
2208 dst += cluster_b->size(); 2217 dst += cluster_b->size();
2209 2218
2210 ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO); 2219 ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
2211 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 2220 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2212 AppendDataInPieces(buffer.get(), buffer_size); 2221 ASSERT_TRUE(AppendDataInPieces(buffer.get(), buffer_size));
2213 2222
2214 GenerateExpectedReads(0, 9); 2223 GenerateExpectedReads(0, 9);
2215 } 2224 }
2216 2225
2217 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) { 2226 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) {
2218 struct BufferTimestamps buffer_timestamps[] = { 2227 struct BufferTimestamps buffer_timestamps[] = {
2219 {0, 0}, 2228 {0, 0},
2220 {33, 3}, 2229 {33, 3},
2221 {67, 6}, 2230 {67, 6},
2222 {100, 9}, 2231 {100, 9},
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
2334 base::TimeDelta::FromMilliseconds(0), 2343 base::TimeDelta::FromMilliseconds(0),
2335 &video_read_done)); 2344 &video_read_done));
2336 2345
2337 // Make sure the reads haven't completed yet. 2346 // Make sure the reads haven't completed yet.
2338 EXPECT_FALSE(audio_read_done); 2347 EXPECT_FALSE(audio_read_done);
2339 EXPECT_FALSE(video_read_done); 2348 EXPECT_FALSE(video_read_done);
2340 2349
2341 // Append data one byte at a time until one or both reads complete. 2350 // Append data one byte at a time until one or both reads complete.
2342 int i = 0; 2351 int i = 0;
2343 for (; i < cluster->size() && !(audio_read_done || video_read_done); ++i) { 2352 for (; i < cluster->size() && !(audio_read_done || video_read_done); ++i) {
2344 AppendData(cluster->data() + i, 1); 2353 ASSERT_TRUE(AppendData(cluster->data() + i, 1));
2345 message_loop_.RunUntilIdle(); 2354 message_loop_.RunUntilIdle();
2346 } 2355 }
2347 2356
2348 EXPECT_TRUE(audio_read_done || video_read_done); 2357 EXPECT_TRUE(audio_read_done || video_read_done);
2349 EXPECT_GT(i, 0); 2358 EXPECT_GT(i, 0);
2350 EXPECT_LT(i, cluster->size()); 2359 EXPECT_LT(i, cluster->size());
2351 2360
2352 audio_read_done = false; 2361 audio_read_done = false;
2353 video_read_done = false; 2362 video_read_done = false;
2354 ReadAudio(base::Bind(&OnReadDone, 2363 ReadAudio(base::Bind(&OnReadDone,
2355 base::TimeDelta::FromMilliseconds(23), 2364 base::TimeDelta::FromMilliseconds(23),
2356 &audio_read_done)); 2365 &audio_read_done));
2357 ReadVideo(base::Bind(&OnReadDone, 2366 ReadVideo(base::Bind(&OnReadDone,
2358 base::TimeDelta::FromMilliseconds(33), 2367 base::TimeDelta::FromMilliseconds(33),
2359 &video_read_done)); 2368 &video_read_done));
2360 2369
2361 // Make sure the reads haven't completed yet. 2370 // Make sure the reads haven't completed yet.
2362 EXPECT_FALSE(audio_read_done); 2371 EXPECT_FALSE(audio_read_done);
2363 EXPECT_FALSE(video_read_done); 2372 EXPECT_FALSE(video_read_done);
2364 2373
2365 // Append the remaining data. 2374 // Append the remaining data.
2366 ASSERT_LT(i, cluster->size()); 2375 ASSERT_LT(i, cluster->size());
2367 AppendData(cluster->data() + i, cluster->size() - i); 2376 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i));
2368 2377
2369 message_loop_.RunUntilIdle(); 2378 message_loop_.RunUntilIdle();
2370 2379
2371 EXPECT_TRUE(audio_read_done); 2380 EXPECT_TRUE(audio_read_done);
2372 EXPECT_TRUE(video_read_done); 2381 EXPECT_TRUE(video_read_done);
2373 } 2382 }
2374 2383
2375 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { 2384 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) {
2376 EXPECT_CALL(*this, DemuxerOpened()); 2385 EXPECT_CALL(*this, DemuxerOpened());
2377 demuxer_->Initialize( 2386 demuxer_->Initialize(
2378 &host_, 2387 &host_,
2379 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2388 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2380 true); 2389 true);
2381 2390
2382 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 2391 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
2383 2392
2384 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2393 EXPECT_MEDIA_LOG(StreamParsingFailed());
2385 uint8_t tmp = 0; 2394 uint8_t tmp = 0;
2386 demuxer_->AppendData(kSourceId, &tmp, 1, append_window_start_for_next_append_, 2395 ASSERT_FALSE(demuxer_->AppendData(
2387 append_window_end_for_next_append_, 2396 kSourceId, &tmp, 1, append_window_start_for_next_append_,
2388 &timestamp_offset_map_[kSourceId]); 2397 append_window_end_for_next_append_, &timestamp_offset_map_[kSourceId]));
2389 } 2398 }
2390 2399
2391 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { 2400 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
2392 EXPECT_CALL(*this, DemuxerOpened()); 2401 EXPECT_CALL(*this, DemuxerOpened());
2393 demuxer_->Initialize( 2402 demuxer_->Initialize(
2394 &host_, 2403 &host_,
2395 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2404 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2396 true); 2405 true);
2397 2406
2398 std::vector<std::string> codecs(1); 2407 std::vector<std::string> codecs(1);
2399 codecs[0] = "vorbis"; 2408 codecs[0] = "vorbis";
2400 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), 2409 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs),
2401 ChunkDemuxer::kOk); 2410 ChunkDemuxer::kOk);
2402 demuxer_->SetTracksWatcher(kSourceId, 2411 demuxer_->SetTracksWatcher(kSourceId,
2403 base::Bind(&ChunkDemuxerTest::InitSegmentReceived, 2412 base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
2404 base::Unretained(this))); 2413 base::Unretained(this)));
2405 2414
2406 // Video track is unexpected per mimetype. 2415 // Video track is unexpected per mimetype.
2407 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", true)); 2416 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", true));
2408 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2417 EXPECT_MEDIA_LOG(StreamParsingFailed());
2409 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); 2418 ASSERT_FALSE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO));
2410 } 2419 }
2411 2420
2412 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { 2421 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) {
2413 EXPECT_CALL(*this, DemuxerOpened()); 2422 EXPECT_CALL(*this, DemuxerOpened());
2414 demuxer_->Initialize( 2423 demuxer_->Initialize(
2415 &host_, 2424 &host_,
2416 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2425 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2417 true); 2426 true);
2418 2427
2419 std::vector<std::string> codecs(1); 2428 std::vector<std::string> codecs(1);
2420 codecs[0] = "vp8"; 2429 codecs[0] = "vp8";
2421 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), 2430 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
2422 ChunkDemuxer::kOk); 2431 ChunkDemuxer::kOk);
2423 demuxer_->SetTracksWatcher(kSourceId, 2432 demuxer_->SetTracksWatcher(kSourceId,
2424 base::Bind(&ChunkDemuxerTest::InitSegmentReceived, 2433 base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
2425 base::Unretained(this))); 2434 base::Unretained(this)));
2426 2435
2427 // Audio track is unexpected per mimetype. 2436 // Audio track is unexpected per mimetype.
2428 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", true)); 2437 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", true));
2429 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2438 EXPECT_MEDIA_LOG(StreamParsingFailed());
2430 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); 2439 ASSERT_FALSE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO));
2431 } 2440 }
2432 2441
2433 TEST_F(ChunkDemuxerTest, AudioOnlyHeaderWithAVType) { 2442 TEST_F(ChunkDemuxerTest, AudioOnlyHeaderWithAVType) {
2434 EXPECT_CALL(*this, DemuxerOpened()); 2443 EXPECT_CALL(*this, DemuxerOpened());
2435 demuxer_->Initialize( 2444 demuxer_->Initialize(
2436 &host_, 2445 &host_,
2437 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2446 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2438 true); 2447 true);
2439 2448
2440 std::vector<std::string> codecs(2); 2449 std::vector<std::string> codecs(2);
2441 codecs[0] = "vorbis"; 2450 codecs[0] = "vorbis";
2442 codecs[1] = "vp8"; 2451 codecs[1] = "vp8";
2443 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), 2452 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
2444 ChunkDemuxer::kOk); 2453 ChunkDemuxer::kOk);
2445 demuxer_->SetTracksWatcher(kSourceId, 2454 demuxer_->SetTracksWatcher(kSourceId,
2446 base::Bind(&ChunkDemuxerTest::InitSegmentReceived, 2455 base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
2447 base::Unretained(this))); 2456 base::Unretained(this)));
2448 2457
2449 // Video track is also expected per mimetype. 2458 // Video track is also expected per mimetype.
2450 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", false)); 2459 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", false));
2451 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2460 EXPECT_MEDIA_LOG(StreamParsingFailed());
2452 AppendInitSegment(HAS_AUDIO); 2461 ASSERT_FALSE(AppendInitSegment(HAS_AUDIO));
2453 } 2462 }
2454 2463
2455 TEST_F(ChunkDemuxerTest, VideoOnlyHeaderWithAVType) { 2464 TEST_F(ChunkDemuxerTest, VideoOnlyHeaderWithAVType) {
2456 EXPECT_CALL(*this, DemuxerOpened()); 2465 EXPECT_CALL(*this, DemuxerOpened());
2457 demuxer_->Initialize( 2466 demuxer_->Initialize(
2458 &host_, 2467 &host_,
2459 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2468 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2460 true); 2469 true);
2461 2470
2462 std::vector<std::string> codecs(2); 2471 std::vector<std::string> codecs(2);
2463 codecs[0] = "vorbis"; 2472 codecs[0] = "vorbis";
2464 codecs[1] = "vp8"; 2473 codecs[1] = "vp8";
2465 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), 2474 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
2466 ChunkDemuxer::kOk); 2475 ChunkDemuxer::kOk);
2467 demuxer_->SetTracksWatcher(kSourceId, 2476 demuxer_->SetTracksWatcher(kSourceId,
2468 base::Bind(&ChunkDemuxerTest::InitSegmentReceived, 2477 base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
2469 base::Unretained(this))); 2478 base::Unretained(this)));
2470 2479
2471 // Audio track is also expected per mimetype. 2480 // Audio track is also expected per mimetype.
2472 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", false)); 2481 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", false));
2473 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2482 EXPECT_MEDIA_LOG(StreamParsingFailed());
2474 AppendInitSegment(HAS_VIDEO); 2483 ASSERT_FALSE(AppendInitSegment(HAS_VIDEO));
2475 } 2484 }
2476 2485
2477 TEST_F(ChunkDemuxerTest, MultipleHeaders) { 2486 TEST_F(ChunkDemuxerTest, MultipleHeaders) {
2478 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2487 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2479 2488
2480 AppendCluster(kDefaultFirstCluster()); 2489 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
2481 2490
2482 // Append another identical initialization segment. 2491 // Append another identical initialization segment.
2483 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 2492 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2484 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); 2493 ASSERT_TRUE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO));
2485 2494
2486 AppendCluster(kDefaultSecondCluster()); 2495 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
2487 2496
2488 GenerateExpectedReads(0, 9); 2497 GenerateExpectedReads(0, 9);
2489 } 2498 }
2490 2499
2491 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) { 2500 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) {
2492 std::string audio_id = "audio1"; 2501 std::string audio_id = "audio1";
2493 std::string video_id = "video1"; 2502 std::string video_id = "video1";
2494 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2503 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2495 2504
2496 // Append audio and video data into separate source ids. 2505 // Append audio and video data into separate source ids.
2497 AppendCluster(audio_id, 2506 ASSERT_TRUE(AppendCluster(
2498 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2507 audio_id,
2508 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2499 GenerateAudioStreamExpectedReads(0, 4); 2509 GenerateAudioStreamExpectedReads(0, 4);
2500 AppendCluster(video_id, 2510 ASSERT_TRUE(AppendCluster(video_id,
2501 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2511 GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2512 kVideoBlockDuration)));
2502 GenerateVideoStreamExpectedReads(0, 4); 2513 GenerateVideoStreamExpectedReads(0, 4);
2503 } 2514 }
2504 2515
2505 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) { 2516 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) {
2506 // TODO(matthewjheaney): Here and elsewhere, we need more tests 2517 // TODO(matthewjheaney): Here and elsewhere, we need more tests
2507 // for inband text tracks (http://crbug/321455). 2518 // for inband text tracks (http://crbug/321455).
2508 2519
2509 std::string audio_id = "audio1"; 2520 std::string audio_id = "audio1";
2510 std::string video_id = "video1"; 2521 std::string video_id = "video1";
2511 2522
2512 EXPECT_CALL(host_, AddTextStream(_, _)) 2523 EXPECT_CALL(host_, AddTextStream(_, _))
2513 .Times(Exactly(2)); 2524 .Times(Exactly(2));
2514 ASSERT_TRUE(InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, true)); 2525 ASSERT_TRUE(InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, true));
2515 2526
2516 // Append audio and video data into separate source ids. 2527 // Append audio and video data into separate source ids.
2517 AppendCluster(audio_id, 2528 ASSERT_TRUE(AppendCluster(
2518 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2529 audio_id,
2530 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2519 GenerateAudioStreamExpectedReads(0, 4); 2531 GenerateAudioStreamExpectedReads(0, 4);
2520 AppendCluster(video_id, 2532 ASSERT_TRUE(AppendCluster(video_id,
2521 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2533 GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2534 kVideoBlockDuration)));
2522 GenerateVideoStreamExpectedReads(0, 4); 2535 GenerateVideoStreamExpectedReads(0, 4);
2523 } 2536 }
2524 2537
2525 TEST_F(ChunkDemuxerTest, AddIdFailures) { 2538 TEST_F(ChunkDemuxerTest, AddIdFailures) {
2526 EXPECT_CALL(*this, DemuxerOpened()); 2539 EXPECT_CALL(*this, DemuxerOpened());
2527 demuxer_->Initialize( 2540 demuxer_->Initialize(
2528 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); 2541 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
2529 2542
2530 std::string audio_id = "audio1"; 2543 std::string audio_id = "audio1";
2531 std::string video_id = "video1"; 2544 std::string video_id = "video1";
2532 2545
2533 ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk); 2546 ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk);
2534 2547
2535 // Adding an id with audio/video should fail because we already added audio. 2548 // Adding an id with audio/video should fail because we already added audio.
2536 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); 2549 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit);
2537 2550
2538 ExpectInitMediaLogs(HAS_AUDIO); 2551 ExpectInitMediaLogs(HAS_AUDIO);
2539 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 2552 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2540 AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO); 2553 ASSERT_TRUE(AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO));
2541 2554
2542 // Adding an id after append should fail. 2555 // Adding an id after append should fail.
2543 ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit); 2556 ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit);
2544 } 2557 }
2545 2558
2546 // Test that Read() calls after a RemoveId() return "end of stream" buffers. 2559 // Test that Read() calls after a RemoveId() return "end of stream" buffers.
2547 TEST_F(ChunkDemuxerTest, RemoveId) { 2560 TEST_F(ChunkDemuxerTest, RemoveId) {
2548 std::string audio_id = "audio1"; 2561 std::string audio_id = "audio1";
2549 std::string video_id = "video1"; 2562 std::string video_id = "video1";
2550 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2563 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2551 2564
2552 // Append audio and video data into separate source ids. 2565 // Append audio and video data into separate source ids.
2553 AppendCluster(audio_id, 2566 ASSERT_TRUE(AppendCluster(
2554 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2567 audio_id,
2555 AppendCluster(video_id, 2568 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2556 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2569 ASSERT_TRUE(AppendCluster(video_id,
2570 GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2571 kVideoBlockDuration)));
2557 2572
2558 // Read() from audio should return normal buffers. 2573 // Read() from audio should return normal buffers.
2559 GenerateAudioStreamExpectedReads(0, 4); 2574 GenerateAudioStreamExpectedReads(0, 4);
2560 2575
2561 // Remove the audio id. 2576 // Remove the audio id.
2562 demuxer_->RemoveId(audio_id); 2577 demuxer_->RemoveId(audio_id);
2563 2578
2564 // Read() from audio should return "end of stream" buffers. 2579 // Read() from audio should return "end of stream" buffers.
2565 bool audio_read_done = false; 2580 bool audio_read_done = false;
2566 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); 2581 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
(...skipping 12 matching lines...) Expand all
2579 demuxer_->RemoveId(audio_id_1); 2594 demuxer_->RemoveId(audio_id_1);
2580 2595
2581 std::string audio_id_2 = "audio2"; 2596 std::string audio_id_2 = "audio2";
2582 ASSERT_TRUE(AddId(audio_id_2, HAS_AUDIO) == ChunkDemuxer::kOk); 2597 ASSERT_TRUE(AddId(audio_id_2, HAS_AUDIO) == ChunkDemuxer::kOk);
2583 } 2598 }
2584 2599
2585 TEST_F(ChunkDemuxerTest, SeekCanceled) { 2600 TEST_F(ChunkDemuxerTest, SeekCanceled) {
2586 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2601 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2587 2602
2588 // Append cluster at the beginning of the stream. 2603 // Append cluster at the beginning of the stream.
2589 AppendCluster(GenerateCluster(0, 4)); 2604 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 4)));
2590 2605
2591 // Seek to an unbuffered region. 2606 // Seek to an unbuffered region.
2592 Seek(base::TimeDelta::FromSeconds(50)); 2607 Seek(base::TimeDelta::FromSeconds(50));
2593 2608
2594 // Attempt to read in unbuffered area; should not fulfill the read. 2609 // Attempt to read in unbuffered area; should not fulfill the read.
2595 bool audio_read_done = false; 2610 bool audio_read_done = false;
2596 bool video_read_done = false; 2611 bool video_read_done = false;
2597 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); 2612 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
2598 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); 2613 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
2599 EXPECT_FALSE(audio_read_done); 2614 EXPECT_FALSE(audio_read_done);
2600 EXPECT_FALSE(video_read_done); 2615 EXPECT_FALSE(video_read_done);
2601 2616
2602 // Now cancel the pending seek, which should flush the reads with empty 2617 // Now cancel the pending seek, which should flush the reads with empty
2603 // buffers. 2618 // buffers.
2604 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); 2619 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
2605 demuxer_->CancelPendingSeek(seek_time); 2620 demuxer_->CancelPendingSeek(seek_time);
2606 message_loop_.RunUntilIdle(); 2621 message_loop_.RunUntilIdle();
2607 EXPECT_TRUE(audio_read_done); 2622 EXPECT_TRUE(audio_read_done);
2608 EXPECT_TRUE(video_read_done); 2623 EXPECT_TRUE(video_read_done);
2609 2624
2610 // A seek back to the buffered region should succeed. 2625 // A seek back to the buffered region should succeed.
2611 Seek(seek_time); 2626 Seek(seek_time);
2612 GenerateExpectedReads(0, 4); 2627 GenerateExpectedReads(0, 4);
2613 } 2628 }
2614 2629
2615 TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) { 2630 TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) {
2616 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2631 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2617 2632
2618 // Append cluster at the beginning of the stream. 2633 // Append cluster at the beginning of the stream.
2619 AppendCluster(GenerateCluster(0, 4)); 2634 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 4)));
2620 2635
2621 // Start waiting for a seek. 2636 // Start waiting for a seek.
2622 base::TimeDelta seek_time1 = base::TimeDelta::FromSeconds(50); 2637 base::TimeDelta seek_time1 = base::TimeDelta::FromSeconds(50);
2623 base::TimeDelta seek_time2 = base::TimeDelta::FromSeconds(0); 2638 base::TimeDelta seek_time2 = base::TimeDelta::FromSeconds(0);
2624 demuxer_->StartWaitingForSeek(seek_time1); 2639 demuxer_->StartWaitingForSeek(seek_time1);
2625 2640
2626 // Now cancel the upcoming seek to an unbuffered region. 2641 // Now cancel the upcoming seek to an unbuffered region.
2627 demuxer_->CancelPendingSeek(seek_time2); 2642 demuxer_->CancelPendingSeek(seek_time2);
2628 demuxer_->Seek(seek_time1, NewExpectedStatusCB(PIPELINE_OK)); 2643 demuxer_->Seek(seek_time1, NewExpectedStatusCB(PIPELINE_OK));
2629 2644
2630 // Read requests should be fulfilled with empty buffers. 2645 // Read requests should be fulfilled with empty buffers.
2631 bool audio_read_done = false; 2646 bool audio_read_done = false;
2632 bool video_read_done = false; 2647 bool video_read_done = false;
2633 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); 2648 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
2634 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); 2649 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
2635 EXPECT_TRUE(audio_read_done); 2650 EXPECT_TRUE(audio_read_done);
2636 EXPECT_TRUE(video_read_done); 2651 EXPECT_TRUE(video_read_done);
2637 2652
2638 // A seek back to the buffered region should succeed. 2653 // A seek back to the buffered region should succeed.
2639 Seek(seek_time2); 2654 Seek(seek_time2);
2640 GenerateExpectedReads(0, 4); 2655 GenerateExpectedReads(0, 4);
2641 } 2656 }
2642 2657
2643 // Test that Seek() successfully seeks to all source IDs. 2658 // Test that Seek() successfully seeks to all source IDs.
2644 TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) { 2659 TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) {
2645 std::string audio_id = "audio1"; 2660 std::string audio_id = "audio1";
2646 std::string video_id = "video1"; 2661 std::string video_id = "video1";
2647 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2662 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2648 2663
2649 AppendCluster( 2664 ASSERT_TRUE(AppendCluster(
2650 audio_id, 2665 audio_id,
2651 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2666 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2652 AppendCluster( 2667 ASSERT_TRUE(AppendCluster(video_id,
2653 video_id, 2668 GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2654 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2669 kVideoBlockDuration)));
2655 2670
2656 // Read() should return buffers at 0. 2671 // Read() should return buffers at 0.
2657 bool audio_read_done = false; 2672 bool audio_read_done = false;
2658 bool video_read_done = false; 2673 bool video_read_done = false;
2659 ReadAudio(base::Bind(&OnReadDone, 2674 ReadAudio(base::Bind(&OnReadDone,
2660 base::TimeDelta::FromMilliseconds(0), 2675 base::TimeDelta::FromMilliseconds(0),
2661 &audio_read_done)); 2676 &audio_read_done));
2662 ReadVideo(base::Bind(&OnReadDone, 2677 ReadVideo(base::Bind(&OnReadDone,
2663 base::TimeDelta::FromMilliseconds(0), 2678 base::TimeDelta::FromMilliseconds(0),
2664 &video_read_done)); 2679 &video_read_done));
2665 EXPECT_TRUE(audio_read_done); 2680 EXPECT_TRUE(audio_read_done);
2666 EXPECT_TRUE(video_read_done); 2681 EXPECT_TRUE(video_read_done);
2667 2682
2668 // Seek to 3 (an unbuffered region). 2683 // Seek to 3 (an unbuffered region).
2669 Seek(base::TimeDelta::FromSeconds(3)); 2684 Seek(base::TimeDelta::FromSeconds(3));
2670 2685
2671 audio_read_done = false; 2686 audio_read_done = false;
2672 video_read_done = false; 2687 video_read_done = false;
2673 ReadAudio(base::Bind(&OnReadDone, 2688 ReadAudio(base::Bind(&OnReadDone,
2674 base::TimeDelta::FromSeconds(3), 2689 base::TimeDelta::FromSeconds(3),
2675 &audio_read_done)); 2690 &audio_read_done));
2676 ReadVideo(base::Bind(&OnReadDone, 2691 ReadVideo(base::Bind(&OnReadDone,
2677 base::TimeDelta::FromSeconds(3), 2692 base::TimeDelta::FromSeconds(3),
2678 &video_read_done)); 2693 &video_read_done));
2679 // Read()s should not return until after data is appended at the Seek point. 2694 // Read()s should not return until after data is appended at the Seek point.
2680 EXPECT_FALSE(audio_read_done); 2695 EXPECT_FALSE(audio_read_done);
2681 EXPECT_FALSE(video_read_done); 2696 EXPECT_FALSE(video_read_done);
2682 2697
2683 AppendCluster(audio_id, 2698 ASSERT_TRUE(AppendCluster(
2684 GenerateSingleStreamCluster( 2699 audio_id, GenerateSingleStreamCluster(3000, 3092, kAudioTrackNum,
2685 3000, 3092, kAudioTrackNum, kAudioBlockDuration)); 2700 kAudioBlockDuration)));
2686 AppendCluster(video_id, 2701 ASSERT_TRUE(AppendCluster(
2687 GenerateSingleStreamCluster( 2702 video_id, GenerateSingleStreamCluster(3000, 3132, kVideoTrackNum,
2688 3000, 3132, kVideoTrackNum, kVideoBlockDuration)); 2703 kVideoBlockDuration)));
2689 2704
2690 message_loop_.RunUntilIdle(); 2705 message_loop_.RunUntilIdle();
2691 2706
2692 // Read() should return buffers at 3. 2707 // Read() should return buffers at 3.
2693 EXPECT_TRUE(audio_read_done); 2708 EXPECT_TRUE(audio_read_done);
2694 EXPECT_TRUE(video_read_done); 2709 EXPECT_TRUE(video_read_done);
2695 } 2710 }
2696 2711
2697 // Test that Seek() completes successfully when EndOfStream 2712 // Test that Seek() completes successfully when EndOfStream
2698 // is called before data is available for that seek point. 2713 // is called before data is available for that seek point.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2767 2782
2768 message_loop_.RunUntilIdle(); 2783 message_loop_.RunUntilIdle();
2769 2784
2770 EXPECT_TRUE(seek_cb_was_called); 2785 EXPECT_TRUE(seek_cb_was_called);
2771 2786
2772 ShutdownDemuxer(); 2787 ShutdownDemuxer();
2773 } 2788 }
2774 2789
2775 // Test ranges in an audio-only stream. 2790 // Test ranges in an audio-only stream.
2776 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { 2791 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) {
2777 EXPECT_CALL(*this, DemuxerOpened()); 2792 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
2778 demuxer_->Initialize(
2779 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
2780
2781 ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk);
2782 ExpectInitMediaLogs(HAS_AUDIO);
2783 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2784 AppendInitSegment(HAS_AUDIO);
2785 2793
2786 // Test a simple cluster. 2794 // Test a simple cluster.
2787 AppendCluster( 2795 ASSERT_TRUE(AppendCluster(
2788 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2796 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2789 2797
2790 CheckExpectedRanges("{ [0,92) }"); 2798 CheckExpectedRanges("{ [0,92) }");
2791 2799
2792 // Append a disjoint cluster to check for two separate ranges. 2800 // Append a disjoint cluster to check for two separate ranges.
2793 AppendCluster(GenerateSingleStreamCluster( 2801 ASSERT_TRUE(AppendCluster(GenerateSingleStreamCluster(
2794 150, 219, kAudioTrackNum, kAudioBlockDuration)); 2802 150, 219, kAudioTrackNum, kAudioBlockDuration)));
2795 2803
2796 CheckExpectedRanges("{ [0,92) [150,219) }"); 2804 CheckExpectedRanges("{ [0,92) [150,219) }");
2797 } 2805 }
2798 2806
2799 // Test ranges in a video-only stream. 2807 // Test ranges in a video-only stream.
2800 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { 2808 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
2801 EXPECT_CALL(*this, DemuxerOpened()); 2809 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
2802 demuxer_->Initialize(
2803 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
2804
2805 ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk);
2806 ExpectInitMediaLogs(HAS_VIDEO);
2807 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2808 AppendInitSegment(HAS_VIDEO);
2809 2810
2810 // Test a simple cluster. 2811 // Test a simple cluster.
2811 AppendCluster( 2812 ASSERT_TRUE(AppendCluster(GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2812 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2813 kVideoBlockDuration)));
2813 2814
2814 CheckExpectedRanges("{ [0,132) }"); 2815 CheckExpectedRanges("{ [0,132) }");
2815 2816
2816 // Append a disjoint cluster to check for two separate ranges. 2817 // Append a disjoint cluster to check for two separate ranges.
2817 AppendCluster(GenerateSingleStreamCluster( 2818 ASSERT_TRUE(AppendCluster(GenerateSingleStreamCluster(
2818 200, 299, kVideoTrackNum, kVideoBlockDuration)); 2819 200, 299, kVideoTrackNum, kVideoBlockDuration)));
2819 2820
2820 CheckExpectedRanges("{ [0,132) [200,299) }"); 2821 CheckExpectedRanges("{ [0,132) [200,299) }");
2821 } 2822 }
2822 2823
2823 TEST_F(ChunkDemuxerTest, GetBufferedRanges_SeparateStreams) { 2824 TEST_F(ChunkDemuxerTest, GetBufferedRanges_SeparateStreams) {
2824 std::string audio_id = "audio1"; 2825 std::string audio_id = "audio1";
2825 std::string video_id = "video1"; 2826 std::string video_id = "video1";
2826 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2827 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2827 2828
2828 // Append audio and video data into separate source ids. 2829 // Append audio and video data into separate source ids.
2829 2830
2830 // Audio block: 0 -> 23 2831 // Audio block: 0 -> 23
2831 // Video block: 0 -> 33 2832 // Video block: 0 -> 33
2832 // Buffered Range: 0 -> 23 2833 // Buffered Range: 0 -> 23
2833 // Audio block duration is smaller than video block duration, 2834 // Audio block duration is smaller than video block duration,
2834 // so the buffered ranges should correspond to the audio blocks. 2835 // so the buffered ranges should correspond to the audio blocks.
2835 AppendCluster(audio_id, 2836 ASSERT_TRUE(AppendCluster(
2836 GenerateSingleStreamCluster(0, 23, kAudioTrackNum, 23)); 2837 audio_id, GenerateSingleStreamCluster(0, 23, kAudioTrackNum, 23)));
2837 AppendCluster(video_id, 2838 ASSERT_TRUE(AppendCluster(
2838 GenerateSingleStreamCluster(0, 33, kVideoTrackNum, 33)); 2839 video_id, GenerateSingleStreamCluster(0, 33, kVideoTrackNum, 33)));
2839 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }"); 2840 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }");
2840 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }"); 2841 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }");
2841 CheckExpectedRangesForMediaSource("{ [0,23) }"); 2842 CheckExpectedRangesForMediaSource("{ [0,23) }");
2842 2843
2843 // Audio blocks: 300 -> 400 2844 // Audio blocks: 300 -> 400
2844 // Video blocks: 320 -> 420 2845 // Video blocks: 320 -> 420
2845 // Buffered Range: 320 -> 400 (jagged start and end across SourceBuffers) 2846 // Buffered Range: 320 -> 400 (jagged start and end across SourceBuffers)
2846 AppendCluster(audio_id, 2847 ASSERT_TRUE(AppendCluster(
2847 GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50)); 2848 audio_id, GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50)));
2848 AppendCluster(video_id, 2849 ASSERT_TRUE(AppendCluster(
2849 GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50)); 2850 video_id, GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50)));
2850 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }"); 2851 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }");
2851 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) }"); 2852 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) }");
2852 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) }"); 2853 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) }");
2853 2854
2854 // Audio block: 520 -> 590 2855 // Audio block: 520 -> 590
2855 // Video block: 500 -> 570 2856 // Video block: 500 -> 570
2856 // Buffered Range: 520 -> 570 (jagged start and end across SourceBuffers) 2857 // Buffered Range: 520 -> 570 (jagged start and end across SourceBuffers)
2857 AppendCluster(audio_id, 2858 ASSERT_TRUE(AppendCluster(
2858 GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70)); 2859 audio_id, GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70)));
2859 AppendCluster(video_id, 2860 ASSERT_TRUE(AppendCluster(
2860 GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70)); 2861 video_id, GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70)));
2861 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [520,590) }"); 2862 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [520,590) }");
2862 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) [500,570) }"); 2863 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) [500,570) }");
2863 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) }"); 2864 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) }");
2864 2865
2865 // Audio block: 720 -> 750 2866 // Audio block: 720 -> 750
2866 // Video block: 700 -> 770 2867 // Video block: 700 -> 770
2867 // Buffered Range: 720 -> 750 (complete overlap of audio) 2868 // Buffered Range: 720 -> 750 (complete overlap of audio)
2868 AppendCluster(audio_id, 2869 ASSERT_TRUE(AppendCluster(
2869 GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30)); 2870 audio_id, GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30)));
2870 AppendCluster(video_id, 2871 ASSERT_TRUE(AppendCluster(
2871 GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70)); 2872 video_id, GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70)));
2872 CheckExpectedRanges(DemuxerStream::AUDIO, 2873 CheckExpectedRanges(DemuxerStream::AUDIO,
2873 "{ [0,23) [300,400) [520,590) [720,750) }"); 2874 "{ [0,23) [300,400) [520,590) [720,750) }");
2874 CheckExpectedRanges(DemuxerStream::VIDEO, 2875 CheckExpectedRanges(DemuxerStream::VIDEO,
2875 "{ [0,33) [320,420) [500,570) [700,770) }"); 2876 "{ [0,33) [320,420) [500,570) [700,770) }");
2876 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) [720,750) }"); 2877 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) [720,750) }");
2877 2878
2878 // Audio block: 900 -> 970 2879 // Audio block: 900 -> 970
2879 // Video block: 920 -> 950 2880 // Video block: 920 -> 950
2880 // Buffered Range: 920 -> 950 (complete overlap of video) 2881 // Buffered Range: 920 -> 950 (complete overlap of video)
2881 AppendCluster(audio_id, 2882 ASSERT_TRUE(AppendCluster(
2882 GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70)); 2883 audio_id, GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70)));
2883 AppendCluster(video_id, 2884 ASSERT_TRUE(AppendCluster(
2884 GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30)); 2885 video_id, GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30)));
2885 CheckExpectedRanges(DemuxerStream::AUDIO, 2886 CheckExpectedRanges(DemuxerStream::AUDIO,
2886 "{ [0,23) [300,400) [520,590) [720,750) [900,970) }"); 2887 "{ [0,23) [300,400) [520,590) [720,750) [900,970) }");
2887 CheckExpectedRanges(DemuxerStream::VIDEO, 2888 CheckExpectedRanges(DemuxerStream::VIDEO,
2888 "{ [0,33) [320,420) [500,570) [700,770) [920,950) }"); 2889 "{ [0,33) [320,420) [500,570) [700,770) [920,950) }");
2889 CheckExpectedRangesForMediaSource( 2890 CheckExpectedRangesForMediaSource(
2890 "{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); 2891 "{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
2891 2892
2892 // Appending within buffered range should not affect buffered ranges. 2893 // Appending within buffered range should not affect buffered ranges.
2893 EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000)); 2894 EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000));
2894 AppendCluster(audio_id, 2895 ASSERT_TRUE(AppendCluster(
2895 GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20)); 2896 audio_id, GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20)));
2896 AppendCluster(video_id, 2897 ASSERT_TRUE(AppendCluster(
2897 GenerateSingleStreamCluster(930, 950, kVideoTrackNum, 20)); 2898 video_id, GenerateSingleStreamCluster(930, 950, kVideoTrackNum, 20)));
2898 CheckExpectedRanges(DemuxerStream::AUDIO, 2899 CheckExpectedRanges(DemuxerStream::AUDIO,
2899 "{ [0,23) [300,400) [520,590) [720,750) [900,970) }"); 2900 "{ [0,23) [300,400) [520,590) [720,750) [900,970) }");
2900 CheckExpectedRanges(DemuxerStream::VIDEO, 2901 CheckExpectedRanges(DemuxerStream::VIDEO,
2901 "{ [0,33) [320,420) [500,570) [700,770) [920,950) }"); 2902 "{ [0,33) [320,420) [500,570) [700,770) [920,950) }");
2902 CheckExpectedRangesForMediaSource( 2903 CheckExpectedRangesForMediaSource(
2903 "{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); 2904 "{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
2904 } 2905 }
2905 2906
2906 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { 2907 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
2907 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2908 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
3063 // end timestamp according to the spec. The last audio range gets extended 3064 // end timestamp according to the spec. The last audio range gets extended
3064 // from [200,246) to [200,398) which is why the intersection results in the 3065 // from [200,246) to [200,398) which is why the intersection results in the
3065 // middle range getting larger AND the new range appearing. 3066 // middle range getting larger AND the new range appearing.
3066 CheckExpectedRanges("{ [0,46) [200,266) [332,398) }"); 3067 CheckExpectedRanges("{ [0,46) [200,266) [332,398) }");
3067 } 3068 }
3068 3069
3069 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) { 3070 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) {
3070 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3071 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3071 3072
3072 // Create a cluster where the video timecode begins 25ms after the audio. 3073 // Create a cluster where the video timecode begins 25ms after the audio.
3073 AppendCluster(GenerateCluster(0, 25, 8)); 3074 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 25, 8)));
3074 3075
3075 Seek(base::TimeDelta::FromSeconds(0)); 3076 Seek(base::TimeDelta::FromSeconds(0));
3076 GenerateExpectedReads(0, 25, 8); 3077 GenerateExpectedReads(0, 25, 8);
3077 3078
3078 // Seek to 5 seconds. 3079 // Seek to 5 seconds.
3079 Seek(base::TimeDelta::FromSeconds(5)); 3080 Seek(base::TimeDelta::FromSeconds(5));
3080 3081
3081 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms 3082 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms
3082 // after the video. 3083 // after the video.
3083 AppendCluster(GenerateCluster(5025, 5000, 8)); 3084 ASSERT_TRUE(AppendCluster(GenerateCluster(5025, 5000, 8)));
3084 GenerateExpectedReads(5025, 5000, 8); 3085 GenerateExpectedReads(5025, 5000, 8);
3085 } 3086 }
3086 3087
3087 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) { 3088 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) {
3088 std::string audio_id = "audio1"; 3089 std::string audio_id = "audio1";
3089 std::string video_id = "video1"; 3090 std::string video_id = "video1";
3090 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 3091 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
3091 3092
3092 // Generate two streams where the video stream starts 5ms after the audio 3093 // Generate two streams where the video stream starts 5ms after the audio
3093 // stream and append them. 3094 // stream and append them.
3094 AppendCluster(audio_id, GenerateSingleStreamCluster( 3095 ASSERT_TRUE(AppendCluster(
3095 25, 4 * kAudioBlockDuration + 25, kAudioTrackNum, kAudioBlockDuration)); 3096 audio_id,
3096 AppendCluster(video_id, GenerateSingleStreamCluster( 3097 GenerateSingleStreamCluster(25, 4 * kAudioBlockDuration + 25,
3097 30, 4 * kVideoBlockDuration + 30, kVideoTrackNum, kVideoBlockDuration)); 3098 kAudioTrackNum, kAudioBlockDuration)));
3099 ASSERT_TRUE(AppendCluster(
3100 video_id,
3101 GenerateSingleStreamCluster(30, 4 * kVideoBlockDuration + 30,
3102 kVideoTrackNum, kVideoBlockDuration)));
3098 3103
3099 // Both streams should be able to fulfill a seek to 25. 3104 // Both streams should be able to fulfill a seek to 25.
3100 Seek(base::TimeDelta::FromMilliseconds(25)); 3105 Seek(base::TimeDelta::FromMilliseconds(25));
3101 GenerateAudioStreamExpectedReads(25, 4); 3106 GenerateAudioStreamExpectedReads(25, 4);
3102 GenerateVideoStreamExpectedReads(30, 4); 3107 GenerateVideoStreamExpectedReads(30, 4);
3103 } 3108 }
3104 3109
3105 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) { 3110 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) {
3106 std::string audio_id = "audio1"; 3111 std::string audio_id = "audio1";
3107 std::string video_id = "video1"; 3112 std::string video_id = "video1";
3108 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 3113 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
3109 3114
3110 // Generate two streams where the video stream starts 10s after the audio 3115 // Generate two streams where the video stream starts 10s after the audio
3111 // stream and append them. 3116 // stream and append them.
3112 AppendCluster(audio_id, GenerateSingleStreamCluster(0, 3117 ASSERT_TRUE(AppendCluster(
3113 4 * kAudioBlockDuration + 0, kAudioTrackNum, kAudioBlockDuration)); 3118 audio_id,
3114 AppendCluster(video_id, GenerateSingleStreamCluster(10000, 3119 GenerateSingleStreamCluster(0, 4 * kAudioBlockDuration + 0,
3115 4 * kVideoBlockDuration + 10000, kVideoTrackNum, kVideoBlockDuration)); 3120 kAudioTrackNum, kAudioBlockDuration)));
3121 ASSERT_TRUE(AppendCluster(
3122 video_id,
3123 GenerateSingleStreamCluster(10000, 4 * kVideoBlockDuration + 10000,
3124 kVideoTrackNum, kVideoBlockDuration)));
3116 3125
3117 // Should not be able to fulfill a seek to 0. 3126 // Should not be able to fulfill a seek to 0.
3118 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(0); 3127 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(0);
3119 demuxer_->StartWaitingForSeek(seek_time); 3128 demuxer_->StartWaitingForSeek(seek_time);
3120 demuxer_->Seek(seek_time, 3129 demuxer_->Seek(seek_time,
3121 NewExpectedStatusCB(PIPELINE_ERROR_ABORT)); 3130 NewExpectedStatusCB(PIPELINE_ERROR_ABORT));
3122 ExpectRead(DemuxerStream::AUDIO, 0); 3131 ExpectRead(DemuxerStream::AUDIO, 0);
3123 ExpectEndOfStream(DemuxerStream::VIDEO); 3132 ExpectEndOfStream(DemuxerStream::VIDEO);
3124 } 3133 }
3125 3134
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
3172 3181
3173 TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) { 3182 TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) {
3174 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3183 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3175 3184
3176 EXPECT_CALL(host_, SetDuration(_)) 3185 EXPECT_CALL(host_, SetDuration(_))
3177 .Times(AnyNumber()); 3186 .Times(AnyNumber());
3178 3187
3179 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92); 3188 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92);
3180 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99); 3189 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99);
3181 3190
3182 AppendCluster(kDefaultFirstCluster()); 3191 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
3183 AppendCluster(kDefaultSecondCluster()); 3192 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
3184 MarkEndOfStream(PIPELINE_OK); 3193 MarkEndOfStream(PIPELINE_OK);
3185 3194
3186 DemuxerStream::Status status; 3195 DemuxerStream::Status status;
3187 base::TimeDelta last_timestamp; 3196 base::TimeDelta last_timestamp;
3188 3197
3189 // Verify that we can read audio & video to the end w/o problems. 3198 // Verify that we can read audio & video to the end w/o problems.
3190 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 3199 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
3191 EXPECT_EQ(DemuxerStream::kOk, status); 3200 EXPECT_EQ(DemuxerStream::kOk, status);
3192 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); 3201 EXPECT_EQ(kLastAudioTimestamp, last_timestamp);
3193 3202
(...skipping 23 matching lines...) Expand all
3217 CheckExpectedRanges("video", "{ }"); 3226 CheckExpectedRanges("video", "{ }");
3218 } 3227 }
3219 3228
3220 // Test that Seek() completes successfully when the first cluster 3229 // Test that Seek() completes successfully when the first cluster
3221 // arrives. 3230 // arrives.
3222 TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) { 3231 TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) {
3223 InSequence s; 3232 InSequence s;
3224 3233
3225 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3234 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3226 3235
3227 AppendCluster(kDefaultFirstCluster()); 3236 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
3228 3237
3229 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); 3238 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
3230 demuxer_->StartWaitingForSeek(seek_time); 3239 demuxer_->StartWaitingForSeek(seek_time);
3231 3240
3232 AppendCluster(kDefaultSecondCluster()); 3241 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
3233 EXPECT_CALL(host_, SetDuration( 3242 EXPECT_CALL(host_, SetDuration(
3234 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); 3243 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp)));
3235 MarkEndOfStream(PIPELINE_OK); 3244 MarkEndOfStream(PIPELINE_OK);
3236 3245
3237 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); 3246 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK));
3238 3247
3239 GenerateExpectedReads(0, 4); 3248 GenerateExpectedReads(0, 4);
3240 GenerateExpectedReads(46, 66, 5); 3249 GenerateExpectedReads(46, 66, 5);
3241 3250
3242 EndOfStreamHelper end_of_stream_helper(demuxer_.get()); 3251 EndOfStreamHelper end_of_stream_helper(demuxer_.get());
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
3379 3388
3380 // Verify that no config change is signalled. 3389 // Verify that no config change is signalled.
3381 ExpectRead(DemuxerStream::VIDEO, 801); 3390 ExpectRead(DemuxerStream::VIDEO, 801);
3382 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); 3391 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
3383 } 3392 }
3384 3393
3385 TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) { 3394 TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) {
3386 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3395 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3387 3396
3388 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30))); 3397 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30)));
3389 AppendCluster(GenerateCluster(0, 2)); 3398 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 2)));
3390 3399
3391 Seek(base::TimeDelta::FromMilliseconds(30000)); 3400 Seek(base::TimeDelta::FromMilliseconds(30000));
3392 3401
3393 GenerateExpectedReads(30000, 2); 3402 GenerateExpectedReads(30000, 2);
3394 } 3403 }
3395 3404
3396 TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) { 3405 TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) {
3397 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3406 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3398 3407
3399 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1))); 3408 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1)));
3400 AppendCluster(GenerateCluster(1000, 2)); 3409 ASSERT_TRUE(AppendCluster(GenerateCluster(1000, 2)));
3401 3410
3402 GenerateExpectedReads(0, 2); 3411 GenerateExpectedReads(0, 2);
3403 } 3412 }
3404 3413
3405 TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) { 3414 TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) {
3406 std::string audio_id = "audio1"; 3415 std::string audio_id = "audio1";
3407 std::string video_id = "video1"; 3416 std::string video_id = "video1";
3408 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 3417 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
3409 3418
3410 ASSERT_TRUE(SetTimestampOffset( 3419 ASSERT_TRUE(SetTimestampOffset(
3411 audio_id, base::TimeDelta::FromMilliseconds(-2500))); 3420 audio_id, base::TimeDelta::FromMilliseconds(-2500)));
3412 ASSERT_TRUE(SetTimestampOffset( 3421 ASSERT_TRUE(SetTimestampOffset(
3413 video_id, base::TimeDelta::FromMilliseconds(-2500))); 3422 video_id, base::TimeDelta::FromMilliseconds(-2500)));
3414 AppendCluster(audio_id, GenerateSingleStreamCluster(2500, 3423 ASSERT_TRUE(AppendCluster(
3415 2500 + kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); 3424 audio_id,
3416 AppendCluster(video_id, GenerateSingleStreamCluster(2500, 3425 GenerateSingleStreamCluster(2500, 2500 + kAudioBlockDuration * 4,
3417 2500 + kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); 3426 kAudioTrackNum, kAudioBlockDuration)));
3427 ASSERT_TRUE(AppendCluster(
3428 video_id,
3429 GenerateSingleStreamCluster(2500, 2500 + kVideoBlockDuration * 4,
3430 kVideoTrackNum, kVideoBlockDuration)));
3418 GenerateAudioStreamExpectedReads(0, 4); 3431 GenerateAudioStreamExpectedReads(0, 4);
3419 GenerateVideoStreamExpectedReads(0, 4); 3432 GenerateVideoStreamExpectedReads(0, 4);
3420 3433
3421 Seek(base::TimeDelta::FromMilliseconds(27300)); 3434 Seek(base::TimeDelta::FromMilliseconds(27300));
3422 3435
3423 ASSERT_TRUE(SetTimestampOffset( 3436 ASSERT_TRUE(SetTimestampOffset(
3424 audio_id, base::TimeDelta::FromMilliseconds(27300))); 3437 audio_id, base::TimeDelta::FromMilliseconds(27300)));
3425 ASSERT_TRUE(SetTimestampOffset( 3438 ASSERT_TRUE(SetTimestampOffset(
3426 video_id, base::TimeDelta::FromMilliseconds(27300))); 3439 video_id, base::TimeDelta::FromMilliseconds(27300)));
3427 AppendCluster(audio_id, GenerateSingleStreamCluster( 3440 ASSERT_TRUE(AppendCluster(
3428 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); 3441 audio_id,
3429 AppendCluster(video_id, GenerateSingleStreamCluster( 3442 GenerateSingleStreamCluster(0, kAudioBlockDuration * 4, kAudioTrackNum,
3430 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); 3443 kAudioBlockDuration)));
3444 ASSERT_TRUE(AppendCluster(
3445 video_id,
3446 GenerateSingleStreamCluster(0, kVideoBlockDuration * 4, kVideoTrackNum,
3447 kVideoBlockDuration)));
3431 GenerateVideoStreamExpectedReads(27300, 4); 3448 GenerateVideoStreamExpectedReads(27300, 4);
3432 GenerateAudioStreamExpectedReads(27300, 4); 3449 GenerateAudioStreamExpectedReads(27300, 4);
3433 } 3450 }
3434 3451
3435 TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) { 3452 TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) {
3436 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3453 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3437 3454
3438 std::unique_ptr<Cluster> cluster = GenerateCluster(0, 2); 3455 std::unique_ptr<Cluster> cluster = GenerateCluster(0, 2);
3439 // Append only part of the cluster data. 3456 // Append only part of the cluster data.
3440 AppendData(cluster->data(), cluster->size() - 13); 3457 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13));
3441 3458
3442 // Confirm we're in the middle of parsing a media segment. 3459 // Confirm we're in the middle of parsing a media segment.
3443 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); 3460 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
3444 3461
3445 demuxer_->ResetParserState(kSourceId, 3462 demuxer_->ResetParserState(kSourceId,
3446 append_window_start_for_next_append_, 3463 append_window_start_for_next_append_,
3447 append_window_end_for_next_append_, 3464 append_window_end_for_next_append_,
3448 &timestamp_offset_map_[kSourceId]); 3465 &timestamp_offset_map_[kSourceId]);
3449 3466
3450 // After ResetParserState(), parsing should no longer be in the middle of a 3467 // After ResetParserState(), parsing should no longer be in the middle of a
(...skipping 22 matching lines...) Expand all
3473 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000] 3490 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000]
3474 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767] 3491 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767]
3475 // Video: last PES: 3492 // Video: last PES:
3476 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128] 3493 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128]
3477 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794] 3494 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794]
3478 // Audio: last PES: 3495 // Audio: last PES:
3479 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309] 3496 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309]
3480 3497
3481 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts"); 3498 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
3482 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 3499 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
3483 AppendData(kSourceId, buffer->data(), buffer->data_size()); 3500 ASSERT_TRUE(AppendData(kSourceId, buffer->data(), buffer->data_size()));
3484 3501
3485 // Confirm we're in the middle of parsing a media segment. 3502 // Confirm we're in the middle of parsing a media segment.
3486 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); 3503 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
3487 3504
3488 // ResetParserState on the Mpeg2 TS parser triggers the emission of the last 3505 // ResetParserState on the Mpeg2 TS parser triggers the emission of the last
3489 // video buffer which is pending in the stream parser. 3506 // video buffer which is pending in the stream parser.
3490 Ranges<base::TimeDelta> range_before_abort = 3507 Ranges<base::TimeDelta> range_before_abort =
3491 demuxer_->GetBufferedRanges(kSourceId); 3508 demuxer_->GetBufferedRanges(kSourceId);
3492 demuxer_->ResetParserState(kSourceId, 3509 demuxer_->ResetParserState(kSourceId,
3493 append_window_start_for_next_append_, 3510 append_window_start_for_next_append_,
(...skipping 27 matching lines...) Expand all
3521 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000] 3538 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000]
3522 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767] 3539 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767]
3523 // Video: last PES: 3540 // Video: last PES:
3524 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128] 3541 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128]
3525 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794] 3542 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794]
3526 // Audio: last PES: 3543 // Audio: last PES:
3527 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309] 3544 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309]
3528 3545
3529 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts"); 3546 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
3530 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 3547 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
3531 AppendData(kSourceId, buffer->data(), buffer->data_size()); 3548 ASSERT_TRUE(AppendData(kSourceId, buffer->data(), buffer->data_size()));
3532 3549
3533 // Confirm we're in the middle of parsing a media segment. 3550 // Confirm we're in the middle of parsing a media segment.
3534 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); 3551 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
3535 3552
3536 // Seek to a time corresponding to buffers that will be emitted during the 3553 // Seek to a time corresponding to buffers that will be emitted during the
3537 // abort. 3554 // abort.
3538 Seek(base::TimeDelta::FromMilliseconds(4110)); 3555 Seek(base::TimeDelta::FromMilliseconds(4110));
3539 3556
3540 // ResetParserState on the Mpeg2 TS parser triggers the emission of the last 3557 // ResetParserState on the Mpeg2 TS parser triggers the emission of the last
3541 // video buffer which is pending in the stream parser. 3558 // video buffer which is pending in the stream parser.
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3614 static_assert(arraysize(kBuffer) == arraysize(kExpectedReturnValues), 3631 static_assert(arraysize(kBuffer) == arraysize(kExpectedReturnValues),
3615 "test arrays out of sync"); 3632 "test arrays out of sync");
3616 static_assert(arraysize(kBuffer) == sizeof(kBuffer), 3633 static_assert(arraysize(kBuffer) == sizeof(kBuffer),
3617 "there should be one byte per index"); 3634 "there should be one byte per index");
3618 3635
3619 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 3636 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
3620 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)).Times(2); 3637 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)).Times(2);
3621 EXPECT_MEDIA_LOG(GeneratedSplice(22000, 2000)); 3638 EXPECT_MEDIA_LOG(GeneratedSplice(22000, 2000));
3622 for (size_t i = 0; i < sizeof(kBuffer); i++) { 3639 for (size_t i = 0; i < sizeof(kBuffer); i++) {
3623 DVLOG(3) << "Appending and testing index " << i; 3640 DVLOG(3) << "Appending and testing index " << i;
3624 AppendData(kBuffer + i, 1); 3641 ASSERT_TRUE(AppendData(kBuffer + i, 1));
3625 bool expected_return_value = kExpectedReturnValues[i]; 3642 bool expected_return_value = kExpectedReturnValues[i];
3626 EXPECT_EQ(expected_return_value, 3643 EXPECT_EQ(expected_return_value,
3627 demuxer_->IsParsingMediaSegment(kSourceId)); 3644 demuxer_->IsParsingMediaSegment(kSourceId));
3628 } 3645 }
3629 } 3646 }
3630 3647
3631 TEST_F(ChunkDemuxerTest, DurationChange) { 3648 TEST_F(ChunkDemuxerTest, DurationChange) {
3632 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3649 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3633 const int kStreamDuration = kDefaultDuration().InMilliseconds(); 3650 const int kStreamDuration = kDefaultDuration().InMilliseconds();
3634 3651
3635 // Add data leading up to the currently set duration. 3652 // Add data leading up to the currently set duration.
3636 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration, 3653 ASSERT_TRUE(
3637 kStreamDuration - kVideoBlockDuration, 3654 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration,
3638 2)); 3655 kStreamDuration - kVideoBlockDuration, 2)));
3639 3656
3640 CheckExpectedRanges("{ [201191,201224) }"); 3657 CheckExpectedRanges("{ [201191,201224) }");
3641 3658
3642 // Add data beginning at the currently set duration and expect a new duration 3659 // Add data beginning at the currently set duration and expect a new duration
3643 // to be signaled. Note that the last video block will have a higher end 3660 // to be signaled. Note that the last video block will have a higher end
3644 // timestamp than the last audio block. 3661 // timestamp than the last audio block.
3645 const int kNewStreamDurationVideo = kStreamDuration + kVideoBlockDuration; 3662 const int kNewStreamDurationVideo = kStreamDuration + kVideoBlockDuration;
3646 EXPECT_CALL(host_, SetDuration( 3663 EXPECT_CALL(host_, SetDuration(
3647 base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo))); 3664 base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo)));
3648 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2)); 3665 ASSERT_TRUE(
3666 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2)));
3649 3667
3650 CheckExpectedRanges("{ [201191,201247) }"); 3668 CheckExpectedRanges("{ [201191,201247) }");
3651 3669
3652 // Add more data to the end of each media type. Note that the last audio block 3670 // Add more data to the end of each media type. Note that the last audio block
3653 // will have a higher end timestamp than the last video block. 3671 // will have a higher end timestamp than the last video block.
3654 const int kFinalStreamDuration = kStreamDuration + kAudioBlockDuration * 3; 3672 const int kFinalStreamDuration = kStreamDuration + kAudioBlockDuration * 3;
3655 EXPECT_CALL(host_, SetDuration( 3673 EXPECT_CALL(host_, SetDuration(
3656 base::TimeDelta::FromMilliseconds(kFinalStreamDuration))); 3674 base::TimeDelta::FromMilliseconds(kFinalStreamDuration)));
3657 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration, 3675 ASSERT_TRUE(
3658 kStreamDuration + kVideoBlockDuration, 3676 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration,
3659 3)); 3677 kStreamDuration + kVideoBlockDuration, 3)));
3660 3678
3661 // See that the range has increased appropriately (but not to the full 3679 // See that the range has increased appropriately (but not to the full
3662 // duration of 201293, since there is not enough video appended for that). 3680 // duration of 201293, since there is not enough video appended for that).
3663 CheckExpectedRanges("{ [201191,201290) }"); 3681 CheckExpectedRanges("{ [201191,201290) }");
3664 } 3682 }
3665 3683
3666 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) { 3684 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) {
3667 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3685 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3668 ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration())); 3686 ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration()));
3669 EXPECT_CALL(host_, SetDuration( 3687 EXPECT_CALL(host_, SetDuration(
3670 kDefaultDuration() + base::TimeDelta::FromMilliseconds( 3688 kDefaultDuration() + base::TimeDelta::FromMilliseconds(
3671 kVideoBlockDuration * 2))); 3689 kVideoBlockDuration * 2)));
3672 AppendCluster(GenerateCluster(0, 4)); 3690 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 4)));
3673 } 3691 }
3674 3692
3675 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) { 3693 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) {
3676 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3694 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3677 3695
3678 AppendCluster(kDefaultFirstCluster()); 3696 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
3679 3697
3680 EXPECT_CALL(host_, SetDuration( 3698 EXPECT_CALL(host_, SetDuration(
3681 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); 3699 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp)));
3682 MarkEndOfStream(PIPELINE_OK); 3700 MarkEndOfStream(PIPELINE_OK);
3683 } 3701 }
3684 3702
3685 3703
3686 TEST_F(ChunkDemuxerTest, ZeroLengthAppend) { 3704 TEST_F(ChunkDemuxerTest, ZeroLengthAppend) {
3687 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3705 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3688 AppendData(NULL, 0); 3706 ASSERT_TRUE(AppendData(NULL, 0));
3689 } 3707 }
3690 3708
3691 TEST_F(ChunkDemuxerTest, AppendAfterEndOfStream) { 3709 TEST_F(ChunkDemuxerTest, AppendAfterEndOfStream) {
3692 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3710 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3693 3711
3694 EXPECT_CALL(host_, SetDuration(_)) 3712 EXPECT_CALL(host_, SetDuration(_))
3695 .Times(AnyNumber()); 3713 .Times(AnyNumber());
3696 3714
3697 AppendCluster(kDefaultFirstCluster()); 3715 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
3698 MarkEndOfStream(PIPELINE_OK); 3716 MarkEndOfStream(PIPELINE_OK);
3699 3717
3700 demuxer_->UnmarkEndOfStream(); 3718 demuxer_->UnmarkEndOfStream();
3701 3719
3702 AppendCluster(kDefaultSecondCluster()); 3720 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
3703 MarkEndOfStream(PIPELINE_OK); 3721 MarkEndOfStream(PIPELINE_OK);
3704 } 3722 }
3705 3723
3706 // Test receiving a Shutdown() call before we get an Initialize() 3724 // Test receiving a Shutdown() call before we get an Initialize()
3707 // call. This can happen if video element gets destroyed before 3725 // call. This can happen if video element gets destroyed before
3708 // the pipeline has a chance to initialize the demuxer. 3726 // the pipeline has a chance to initialize the demuxer.
3709 TEST_F(ChunkDemuxerTest, Shutdown_BeforeInitialize) { 3727 TEST_F(ChunkDemuxerTest, Shutdown_BeforeInitialize) {
3710 demuxer_->Shutdown(); 3728 demuxer_->Shutdown();
3711 demuxer_->Initialize( 3729 demuxer_->Initialize(
3712 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); 3730 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
3713 message_loop_.RunUntilIdle(); 3731 message_loop_.RunUntilIdle();
3714 } 3732 }
3715 3733
3716 // Verifies that signaling end of stream while stalled at a gap 3734 // Verifies that signaling end of stream while stalled at a gap
3717 // boundary does not trigger end of stream buffers to be returned. 3735 // boundary does not trigger end of stream buffers to be returned.
3718 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { 3736 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) {
3719 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3737 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3720 3738
3721 AppendCluster(0, 10); 3739 ASSERT_TRUE(AppendCluster(0, 10));
3722 AppendCluster(300, 10); 3740 ASSERT_TRUE(AppendCluster(300, 10));
3723 CheckExpectedRanges("{ [0,132) [300,432) }"); 3741 CheckExpectedRanges("{ [0,132) [300,432) }");
3724 3742
3725 GenerateExpectedReads(0, 10); 3743 GenerateExpectedReads(0, 10);
3726 3744
3727 bool audio_read_done = false; 3745 bool audio_read_done = false;
3728 bool video_read_done = false; 3746 bool video_read_done = false;
3729 ReadAudio(base::Bind(&OnReadDone, 3747 ReadAudio(base::Bind(&OnReadDone,
3730 base::TimeDelta::FromMilliseconds(138), 3748 base::TimeDelta::FromMilliseconds(138),
3731 &audio_read_done)); 3749 &audio_read_done));
3732 ReadVideo(base::Bind(&OnReadDone, 3750 ReadVideo(base::Bind(&OnReadDone,
3733 base::TimeDelta::FromMilliseconds(138), 3751 base::TimeDelta::FromMilliseconds(138),
3734 &video_read_done)); 3752 &video_read_done));
3735 3753
3736 // Verify that the reads didn't complete 3754 // Verify that the reads didn't complete
3737 EXPECT_FALSE(audio_read_done); 3755 EXPECT_FALSE(audio_read_done);
3738 EXPECT_FALSE(video_read_done); 3756 EXPECT_FALSE(video_read_done);
3739 3757
3740 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(438))); 3758 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(438)));
3741 MarkEndOfStream(PIPELINE_OK); 3759 MarkEndOfStream(PIPELINE_OK);
3742 3760
3743 // Verify that the reads still haven't completed. 3761 // Verify that the reads still haven't completed.
3744 EXPECT_FALSE(audio_read_done); 3762 EXPECT_FALSE(audio_read_done);
3745 EXPECT_FALSE(video_read_done); 3763 EXPECT_FALSE(video_read_done);
3746 3764
3747 demuxer_->UnmarkEndOfStream(); 3765 demuxer_->UnmarkEndOfStream();
3748 3766
3749 AppendCluster(138, 22); 3767 ASSERT_TRUE(AppendCluster(138, 22));
3750 3768
3751 message_loop_.RunUntilIdle(); 3769 message_loop_.RunUntilIdle();
3752 3770
3753 CheckExpectedRanges("{ [0,435) }"); 3771 CheckExpectedRanges("{ [0,435) }");
3754 3772
3755 // Verify that the reads have completed. 3773 // Verify that the reads have completed.
3756 EXPECT_TRUE(audio_read_done); 3774 EXPECT_TRUE(audio_read_done);
3757 EXPECT_TRUE(video_read_done); 3775 EXPECT_TRUE(video_read_done);
3758 3776
3759 // Read the rest of the buffers. 3777 // Read the rest of the buffers.
(...skipping 22 matching lines...) Expand all
3782 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3800 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3783 3801
3784 // Cancel preroll. 3802 // Cancel preroll.
3785 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200); 3803 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200);
3786 demuxer_->CancelPendingSeek(seek_time); 3804 demuxer_->CancelPendingSeek(seek_time);
3787 3805
3788 // Initiate the seek to the new location. 3806 // Initiate the seek to the new location.
3789 Seek(seek_time); 3807 Seek(seek_time);
3790 3808
3791 // Append data to satisfy the seek. 3809 // Append data to satisfy the seek.
3792 AppendCluster(seek_time.InMilliseconds(), 10); 3810 ASSERT_TRUE(AppendCluster(seek_time.InMilliseconds(), 10));
3793 } 3811 }
3794 3812
3795 TEST_F(ChunkDemuxerTest, SetMemoryLimitType) { 3813 TEST_F(ChunkDemuxerTest, SetMemoryLimitType) {
3796 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3814 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3797 3815
3798 // Set different memory limits for audio and video. 3816 // Set different memory limits for audio and video.
3799 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize); 3817 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize);
3800 demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 5 * kBlockSize + 1); 3818 demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 5 * kBlockSize + 1);
3801 3819
3802 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(1000); 3820 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(1000);
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
4133 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(150); 4151 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(150);
4134 4152
4135 // Read a WebM file into memory and send the data to the demuxer. The chunk 4153 // Read a WebM file into memory and send the data to the demuxer. The chunk
4136 // size has been chosen carefully to ensure the preroll buffer used by the 4154 // size has been chosen carefully to ensure the preroll buffer used by the
4137 // partial append window trim must come from a previous Append() call. 4155 // partial append window trim must come from a previous Append() call.
4138 scoped_refptr<DecoderBuffer> buffer = 4156 scoped_refptr<DecoderBuffer> buffer =
4139 ReadTestDataFile("bear-320x240-audio-only.webm"); 4157 ReadTestDataFile("bear-320x240-audio-only.webm");
4140 ExpectInitMediaLogs(HAS_AUDIO); 4158 ExpectInitMediaLogs(HAS_AUDIO);
4141 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4159 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4142 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)); 4160 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
4143 AppendDataInPieces(buffer->data(), buffer->data_size(), 128); 4161 ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 128));
4144 4162
4145 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4163 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
4146 CheckExpectedBuffers(stream, "50KP 50K 62K 86K 109K 122K 125K 128K"); 4164 CheckExpectedBuffers(stream, "50KP 50K 62K 86K 109K 122K 125K 128K");
4147 } 4165 }
4148 4166
4149 TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { 4167 TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
4150 EXPECT_CALL(*this, DemuxerOpened()); 4168 EXPECT_CALL(*this, DemuxerOpened());
4151 demuxer_->Initialize( 4169 demuxer_->Initialize(
4152 &host_, 4170 &host_,
4153 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK), 4171 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK),
4154 true); 4172 true);
4155 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO)); 4173 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO));
4156 4174
4157 // Set the append window such that the first file is completely before the 4175 // Set the append window such that the first file is completely before the
4158 // append window. 4176 // append window.
4159 // Expect duration adjustment since actual duration differs slightly from 4177 // Expect duration adjustment since actual duration differs slightly from
4160 // duration in the init segment. 4178 // duration in the init segment.
4161 const base::TimeDelta duration_1 = base::TimeDelta::FromMilliseconds(2746); 4179 const base::TimeDelta duration_1 = base::TimeDelta::FromMilliseconds(2746);
4162 append_window_start_for_next_append_ = duration_1; 4180 append_window_start_for_next_append_ = duration_1;
4163 4181
4164 // Read a WebM file into memory and append the data. 4182 // Read a WebM file into memory and append the data.
4165 scoped_refptr<DecoderBuffer> buffer = 4183 scoped_refptr<DecoderBuffer> buffer =
4166 ReadTestDataFile("bear-320x240-audio-only.webm"); 4184 ReadTestDataFile("bear-320x240-audio-only.webm");
4167 ExpectInitMediaLogs(HAS_AUDIO); 4185 ExpectInitMediaLogs(HAS_AUDIO);
4168 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4186 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4169 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)); 4187 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
4170 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); 4188 ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
4171 CheckExpectedRanges("{ }"); 4189 CheckExpectedRanges("{ }");
4172 4190
4173 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4191 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
4174 AudioDecoderConfig config_1 = stream->audio_decoder_config(); 4192 AudioDecoderConfig config_1 = stream->audio_decoder_config();
4175 4193
4176 // Read a second WebM with a different config in and append the data. 4194 // Read a second WebM with a different config in and append the data.
4177 scoped_refptr<DecoderBuffer> buffer2 = 4195 scoped_refptr<DecoderBuffer> buffer2 =
4178 ReadTestDataFile("bear-320x240-audio-only-48khz.webm"); 4196 ReadTestDataFile("bear-320x240-audio-only-48khz.webm");
4179 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4197 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4180 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(21)); 4198 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(21));
4181 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber()); 4199 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
4182 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1)); 4200 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1));
4183 AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512); 4201 ASSERT_TRUE(AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512));
4184 CheckExpectedRanges("{ [2746,5519) }"); 4202 CheckExpectedRanges("{ [2746,5519) }");
4185 4203
4186 Seek(duration_1); 4204 Seek(duration_1);
4187 ExpectConfigChanged(DemuxerStream::AUDIO); 4205 ExpectConfigChanged(DemuxerStream::AUDIO);
4188 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config())); 4206 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config()));
4189 CheckExpectedBuffers(stream, "2746K 2767K 2789K 2810K"); 4207 CheckExpectedBuffers(stream, "2746K 2767K 2789K 2810K");
4190 } 4208 }
4191 4209
4192 TEST_F(ChunkDemuxerTest, AppendWindow_Text) { 4210 TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
4193 DemuxerStream* text_stream = NULL; 4211 DemuxerStream* text_stream = NULL;
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
4360 CheckExpectedBuffers(text_stream, "275K 325K"); 4378 CheckExpectedBuffers(text_stream, "275K 325K");
4361 4379
4362 // Verify that audio & video streams continue to return expected values. 4380 // Verify that audio & video streams continue to return expected values.
4363 CheckExpectedBuffers(audio_stream, "160K 180K"); 4381 CheckExpectedBuffers(audio_stream, "160K 180K");
4364 CheckExpectedBuffers(video_stream, "180 210"); 4382 CheckExpectedBuffers(video_stream, "180 210");
4365 } 4383 }
4366 4384
4367 TEST_F(ChunkDemuxerTest, ClusterWithUnknownSize) { 4385 TEST_F(ChunkDemuxerTest, ClusterWithUnknownSize) {
4368 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4386 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4369 4387
4370 AppendCluster(GenerateCluster(0, 0, 4, true)); 4388 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 0, 4, true)));
4371 CheckExpectedRanges("{ [0,46) }"); 4389 CheckExpectedRanges("{ [0,46) }");
4372 4390
4373 // A new cluster indicates end of the previous cluster with unknown size. 4391 // A new cluster indicates end of the previous cluster with unknown size.
4374 AppendCluster(GenerateCluster(46, 66, 5, true)); 4392 ASSERT_TRUE(AppendCluster(GenerateCluster(46, 66, 5, true)));
4375 CheckExpectedRanges("{ [0,115) }"); 4393 CheckExpectedRanges("{ [0,115) }");
4376 } 4394 }
4377 4395
4378 TEST_F(ChunkDemuxerTest, CuesBetweenClustersWithUnknownSize) { 4396 TEST_F(ChunkDemuxerTest, CuesBetweenClustersWithUnknownSize) {
4379 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4397 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4380 4398
4381 // Add two clusters separated by Cues in a single Append() call. 4399 // Add two clusters separated by Cues in a single Append() call.
4382 std::unique_ptr<Cluster> cluster = GenerateCluster(0, 0, 4, true); 4400 std::unique_ptr<Cluster> cluster = GenerateCluster(0, 0, 4, true);
4383 std::vector<uint8_t> data(cluster->data(), cluster->data() + cluster->size()); 4401 std::vector<uint8_t> data(cluster->data(), cluster->data() + cluster->size());
4384 data.insert(data.end(), kCuesHeader, kCuesHeader + sizeof(kCuesHeader)); 4402 data.insert(data.end(), kCuesHeader, kCuesHeader + sizeof(kCuesHeader));
4385 cluster = GenerateCluster(46, 66, 5, true); 4403 cluster = GenerateCluster(46, 66, 5, true);
4386 data.insert(data.end(), cluster->data(), cluster->data() + cluster->size()); 4404 data.insert(data.end(), cluster->data(), cluster->data() + cluster->size());
4387 AppendData(&*data.begin(), data.size()); 4405 ASSERT_TRUE(AppendData(&*data.begin(), data.size()));
4388 4406
4389 CheckExpectedRanges("{ [0,115) }"); 4407 CheckExpectedRanges("{ [0,115) }");
4390 } 4408 }
4391 4409
4392 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { 4410 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) {
4393 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4411 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4394 4412
4395 AppendCluster(GenerateCluster(0, 0, 4)); 4413 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 0, 4)));
4396 AppendData(kCuesHeader, sizeof(kCuesHeader)); 4414 ASSERT_TRUE(AppendData(kCuesHeader, sizeof(kCuesHeader)));
4397 AppendCluster(GenerateCluster(46, 66, 5)); 4415 ASSERT_TRUE(AppendCluster(GenerateCluster(46, 66, 5)));
4398 CheckExpectedRanges("{ [0,115) }"); 4416 CheckExpectedRanges("{ [0,115) }");
4399 } 4417 }
4400 4418
4401 TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) { 4419 TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) {
4402 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4420 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4403 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize); 4421 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize);
4404 demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 15 * kBlockSize); 4422 demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 15 * kBlockSize);
4405 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4423 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
4406 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4424 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4407 4425
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
4444 // 80 - 10 + 28 = 98). 4462 // 80 - 10 + 28 = 98).
4445 // For video stream 150 + 52 = 202. Video limit is 150 bytes. We need to 4463 // For video stream 150 + 52 = 202. Video limit is 150 bytes. We need to
4446 // remove at least 6 blocks to stay under limit. 4464 // remove at least 6 blocks to stay under limit.
4447 CheckExpectedBuffers(audio_stream, "40K 80K 120K 160K 200K 240K 280K"); 4465 CheckExpectedBuffers(audio_stream, "40K 80K 120K 160K 200K 240K 280K");
4448 CheckExpectedBuffers(video_stream, "60K 70 80K 90 100K 110 120K 130 140K"); 4466 CheckExpectedBuffers(video_stream, "60K 70 80K 90 100K 110 120K 130 140K");
4449 } 4467 }
4450 4468
4451 TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioOnly) { 4469 TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioOnly) {
4452 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 4470 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
4453 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio")); 4471 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio"));
4454 AppendCluster(GenerateEmptyCluster(0)); 4472 ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
4455 } 4473 }
4456 4474
4457 TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_VideoOnly) { 4475 TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_VideoOnly) {
4458 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4476 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4459 EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); 4477 EXPECT_MEDIA_LOG(SegmentMissingFrames("video"));
4460 AppendCluster(GenerateEmptyCluster(0)); 4478 ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
4461 } 4479 }
4462 4480
4463 TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioVideo) { 4481 TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioVideo) {
4464 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4482 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4465 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio")); 4483 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio"));
4466 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 10); 4484 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 10);
4467 } 4485 }
4468 4486
4469 TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_AudioVideo) { 4487 TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_AudioVideo) {
4470 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4488 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4471 EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); 4489 EXPECT_MEDIA_LOG(SegmentMissingFrames("video"));
4472 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10); 4490 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
4473 } 4491 }
4474 4492
4475 TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) { 4493 TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) {
4476 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4494 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4477 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video")); 4495 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video"));
4478 AppendCluster(GenerateEmptyCluster(0)); 4496 ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
4479 } 4497 }
4480 4498
4481 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_FirstSegmentMissingKeyframe) { 4499 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_FirstSegmentMissingKeyframe) {
4482 // Append V:[n n n][n n K] 4500 // Append V:[n n n][n n K]
4483 // Expect V: [K] 4501 // Expect V: [K]
4484 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4502 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4485 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4503 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4486 4504
4487 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2); 4505 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2);
4488 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0 10 20"); 4506 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0 10 20");
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
4661 found = true; 4679 found = true;
4662 break; 4680 break;
4663 } 4681 }
4664 video_start++; 4682 video_start++;
4665 } 4683 }
4666 4684
4667 ASSERT_TRUE(found); 4685 ASSERT_TRUE(found);
4668 ASSERT_GT(video_start, 0); 4686 ASSERT_GT(video_start, 0);
4669 ASSERT_LT(video_start, cluster->size() - 3); 4687 ASSERT_LT(video_start, cluster->size() - 3);
4670 4688
4671 AppendData(kSourceId, cluster->data(), video_start); 4689 ASSERT_TRUE(AppendData(kSourceId, cluster->data(), video_start));
4672 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,30) }"); 4690 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,30) }");
4673 CheckExpectedRanges(DemuxerStream::VIDEO, "{ }"); 4691 CheckExpectedRanges(DemuxerStream::VIDEO, "{ }");
4674 4692
4675 demuxer_->Remove(kSourceId, base::TimeDelta(), 4693 demuxer_->Remove(kSourceId, base::TimeDelta(),
4676 base::TimeDelta::FromMilliseconds(30)); 4694 base::TimeDelta::FromMilliseconds(30));
4677 4695
4678 // Append the remainder of the cluster 4696 // Append the remainder of the cluster
4679 AppendData(kSourceId, cluster->data() + video_start, 4697 ASSERT_TRUE(AppendData(kSourceId, cluster->data() + video_start,
4680 cluster->size() - video_start); 4698 cluster->size() - video_start));
4681 4699
4682 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }"); 4700 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }");
4683 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,91) }"); 4701 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,91) }");
4684 CheckExpectedRanges("{ [30,90) }"); 4702 CheckExpectedRanges("{ [30,90) }");
4685 CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K"); 4703 CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K");
4686 CheckExpectedBuffers(video_stream, "71K 81"); 4704 CheckExpectedBuffers(video_stream, "71K 81");
4687 } 4705 }
4688 4706
4689 } // namespace media 4707 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698