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

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: Rebase 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
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/test/pipeline_integration_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1438 1439
1439 CreateNewDemuxer(); 1440 CreateNewDemuxer();
1440 1441
1441 int stream_flags = 0; 1442 int stream_flags = 0;
1442 if (has_audio) 1443 if (has_audio)
1443 stream_flags |= HAS_AUDIO; 1444 stream_flags |= HAS_AUDIO;
1444 1445
1445 if (has_video) 1446 if (has_video)
1446 stream_flags |= HAS_VIDEO; 1447 stream_flags |= HAS_VIDEO;
1447 1448
1448 ASSERT_TRUE(InitDemuxerWithEncryptionInfo( 1449 if (has_audio || has_video) {
1449 stream_flags, is_audio_encrypted, is_video_encrypted)); 1450 ASSERT_TRUE(InitDemuxerWithEncryptionInfo(
1451 stream_flags, is_audio_encrypted, is_video_encrypted));
1452 } else {
1453 ASSERT_FALSE(InitDemuxerWithEncryptionInfo(
1454 stream_flags, is_audio_encrypted, is_video_encrypted));
1455 }
1450 1456
1451 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1457 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
1452 if (has_audio) { 1458 if (has_audio) {
1453 ASSERT_TRUE(audio_stream); 1459 ASSERT_TRUE(audio_stream);
1454 1460
1455 const AudioDecoderConfig& config = audio_stream->audio_decoder_config(); 1461 const AudioDecoderConfig& config = audio_stream->audio_decoder_config();
1456 EXPECT_EQ(kCodecVorbis, config.codec()); 1462 EXPECT_EQ(kCodecVorbis, config.codec());
1457 EXPECT_EQ(32, config.bits_per_channel()); 1463 EXPECT_EQ(32, config.bits_per_channel());
1458 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout()); 1464 EXPECT_EQ(CHANNEL_LAYOUT_STEREO, config.channel_layout());
1459 EXPECT_EQ(44100, config.samples_per_second()); 1465 EXPECT_EQ(44100, config.samples_per_second());
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
1574 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30), 1580 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30),
1575 MuxedStreamInfo(kTextTrackNum, "10K")); 1581 MuxedStreamInfo(kTextTrackNum, "10K"));
1576 CheckExpectedRanges("{ [0,46) }"); 1582 CheckExpectedRanges("{ [0,46) }");
1577 1583
1578 std::unique_ptr<uint8_t[]> info_tracks; 1584 std::unique_ptr<uint8_t[]> info_tracks;
1579 int info_tracks_size = 0; 1585 int info_tracks_size = 0;
1580 CreateInitSegment( 1586 CreateInitSegment(
1581 HAS_TEXT | HAS_AUDIO | HAS_VIDEO | USE_ALTERNATE_TEXT_TRACK_ID, false, 1587 HAS_TEXT | HAS_AUDIO | HAS_VIDEO | USE_ALTERNATE_TEXT_TRACK_ID, false,
1582 false, &info_tracks, &info_tracks_size); 1588 false, &info_tracks, &info_tracks_size);
1583 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1589 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1584 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, 1590 ASSERT_TRUE(demuxer_->AppendData(
1585 append_window_start_for_next_append_, 1591 kSourceId, info_tracks.get(), info_tracks_size,
1586 append_window_end_for_next_append_, 1592 append_window_start_for_next_append_, append_window_end_for_next_append_,
1587 &timestamp_offset_map_[kSourceId]); 1593 &timestamp_offset_map_[kSourceId]));
1588 1594
1589 AppendMuxedCluster( 1595 AppendMuxedCluster(
1590 MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23), 1596 MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
1591 MuxedStreamInfo(kVideoTrackNum, "60K", 1597 MuxedStreamInfo(kVideoTrackNum, "60K",
1592 WebMClusterParser::kDefaultVideoBufferDurationInMs), 1598 WebMClusterParser::kDefaultVideoBufferDurationInMs),
1593 MuxedStreamInfo(kAlternateTextTrackNum, "45K")); 1599 MuxedStreamInfo(kAlternateTextTrackNum, "45K"));
1594 1600
1595 CheckExpectedRanges("{ [0,92) }"); 1601 CheckExpectedRanges("{ [0,92) }");
1596 CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K"); 1602 CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K");
1597 CheckExpectedBuffers(video_stream, "0K 30 60K"); 1603 CheckExpectedBuffers(video_stream, "0K 30 60K");
(...skipping 12 matching lines...) Expand all
1610 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 1616 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
1611 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 1617 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
1612 ASSERT_TRUE(audio_stream); 1618 ASSERT_TRUE(audio_stream);
1613 ASSERT_TRUE(video_stream); 1619 ASSERT_TRUE(video_stream);
1614 1620
1615 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23), 1621 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 23K", 23),
1616 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30)); 1622 MuxedStreamInfo(kVideoTrackNum, "0K 30", 30));
1617 CheckExpectedRanges("{ [0,46) }"); 1623 CheckExpectedRanges("{ [0,46) }");
1618 1624
1619 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1625 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1620 AppendInitSegment(HAS_AUDIO | HAS_VIDEO | USE_ALTERNATE_AUDIO_TRACK_ID | 1626 ASSERT_TRUE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO |
1621 USE_ALTERNATE_VIDEO_TRACK_ID); 1627 USE_ALTERNATE_AUDIO_TRACK_ID |
1628 USE_ALTERNATE_VIDEO_TRACK_ID));
1622 AppendMuxedCluster(MuxedStreamInfo(kAlternateAudioTrackNum, "46K 69K", 63), 1629 AppendMuxedCluster(MuxedStreamInfo(kAlternateAudioTrackNum, "46K 69K", 63),
1623 MuxedStreamInfo(kAlternateVideoTrackNum, "60K", 23)); 1630 MuxedStreamInfo(kAlternateVideoTrackNum, "60K", 23));
1624 CheckExpectedRanges("{ [0,92) }"); 1631 CheckExpectedRanges("{ [0,92) }");
1625 CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K"); 1632 CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K");
1626 CheckExpectedBuffers(video_stream, "0K 30 60K"); 1633 CheckExpectedBuffers(video_stream, "0K 30 60K");
1627 1634
1628 ShutdownDemuxer(); 1635 ShutdownDemuxer();
1629 } 1636 }
1630 1637
1631 TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) { 1638 TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) {
(...skipping 14 matching lines...) Expand all
1646 ASSERT_TRUE(audio_stream && video_stream && text_stream); 1653 ASSERT_TRUE(audio_stream && video_stream && text_stream);
1647 1654
1648 AppendMuxedCluster( 1655 AppendMuxedCluster(
1649 MuxedStreamInfo(kAudioTrackNum, "23K", 1656 MuxedStreamInfo(kAudioTrackNum, "23K",
1650 WebMClusterParser::kDefaultAudioBufferDurationInMs), 1657 WebMClusterParser::kDefaultAudioBufferDurationInMs),
1651 MuxedStreamInfo(kVideoTrackNum, "0 30K", 30), 1658 MuxedStreamInfo(kVideoTrackNum, "0 30K", 30),
1652 MuxedStreamInfo(kTextTrackNum, "25K 40K")); 1659 MuxedStreamInfo(kTextTrackNum, "25K 40K"));
1653 CheckExpectedRanges("{ [23,46) }"); 1660 CheckExpectedRanges("{ [23,46) }");
1654 1661
1655 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1662 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1656 AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO); 1663 ASSERT_TRUE(AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO));
1657 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23), 1664 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "46K 69K", 23),
1658 MuxedStreamInfo(kVideoTrackNum, "60 90K", 30), 1665 MuxedStreamInfo(kVideoTrackNum, "60 90K", 30),
1659 MuxedStreamInfo(kTextTrackNum, "80K 90K")); 1666 MuxedStreamInfo(kTextTrackNum, "80K 90K"));
1660 CheckExpectedRanges("{ [23,92) }"); 1667 CheckExpectedRanges("{ [23,92) }");
1661 1668
1662 CheckExpectedBuffers(audio_stream, "23K 46K 69K"); 1669 CheckExpectedBuffers(audio_stream, "23K 46K 69K");
1663 CheckExpectedBuffers(video_stream, "30K 90K"); 1670 CheckExpectedBuffers(video_stream, "30K 90K");
1664 CheckExpectedBuffers(text_stream, "25K 40K 80K 90K"); 1671 CheckExpectedBuffers(text_stream, "25K 40K 80K 90K");
1665 } 1672 }
1666 1673
1667 // Make sure that the demuxer reports an error if Shutdown() 1674 // Make sure that the demuxer reports an error if Shutdown()
1668 // is called before all the initialization segments are appended. 1675 // is called before all the initialization segments are appended.
1669 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) { 1676 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppended) {
1670 EXPECT_CALL(*this, DemuxerOpened()); 1677 EXPECT_CALL(*this, DemuxerOpened());
1671 demuxer_->Initialize( 1678 demuxer_->Initialize(
1672 &host_, CreateInitDoneCB( 1679 &host_, CreateInitDoneCB(
1673 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); 1680 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true);
1674 1681
1675 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); 1682 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
1676 EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk); 1683 EXPECT_EQ(AddId("video", HAS_VIDEO), ChunkDemuxer::kOk);
1677 1684
1678 ExpectInitMediaLogs(HAS_AUDIO); 1685 ExpectInitMediaLogs(HAS_AUDIO);
1679 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1686 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1680 AppendInitSegmentWithSourceId("audio", HAS_AUDIO); 1687 ASSERT_TRUE(AppendInitSegmentWithSourceId("audio", HAS_AUDIO));
1681 1688
1682 ShutdownDemuxer(); 1689 ShutdownDemuxer();
1683 } 1690 }
1684 1691
1685 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) { 1692 TEST_F(ChunkDemuxerTest, Shutdown_BeforeAllInitSegmentsAppendedText) {
1686 EXPECT_CALL(*this, DemuxerOpened()); 1693 EXPECT_CALL(*this, DemuxerOpened());
1687 demuxer_->Initialize( 1694 demuxer_->Initialize(
1688 &host_, CreateInitDoneCB( 1695 &host_, CreateInitDoneCB(
1689 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true); 1696 kDefaultDuration(), DEMUXER_ERROR_COULD_NOT_OPEN), true);
1690 1697
1691 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk); 1698 EXPECT_EQ(AddId("audio", HAS_AUDIO), ChunkDemuxer::kOk);
1692 EXPECT_EQ(AddId("video_and_text", HAS_VIDEO), ChunkDemuxer::kOk); 1699 EXPECT_EQ(AddId("video_and_text", HAS_VIDEO), ChunkDemuxer::kOk);
1693 1700
1694 EXPECT_CALL(host_, AddTextStream(_, _)) 1701 EXPECT_CALL(host_, AddTextStream(_, _))
1695 .Times(Exactly(1)); 1702 .Times(Exactly(1));
1696 1703
1697 ExpectInitMediaLogs(HAS_VIDEO); 1704 ExpectInitMediaLogs(HAS_VIDEO);
1698 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 1705 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
1699 AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT); 1706 ASSERT_TRUE(
1707 AppendInitSegmentWithSourceId("video_and_text", HAS_VIDEO | HAS_TEXT));
1700 1708
1701 ShutdownDemuxer(); 1709 ShutdownDemuxer();
1702 } 1710 }
1703 1711
1704 // Verifies that all streams waiting for data receive an end of stream 1712 // Verifies that all streams waiting for data receive an end of stream
1705 // buffer when Shutdown() is called. 1713 // buffer when Shutdown() is called.
1706 TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) { 1714 TEST_F(ChunkDemuxerTest, Shutdown_EndOfStreamWhileWaitingForData) {
1707 DemuxerStream* text_stream = NULL; 1715 DemuxerStream* text_stream = NULL;
1708 EXPECT_CALL(host_, AddTextStream(_, _)) 1716 EXPECT_CALL(host_, AddTextStream(_, _))
1709 .WillOnce(SaveArg<0>(&text_stream)); 1717 .WillOnce(SaveArg<0>(&text_stream));
(...skipping 18 matching lines...) Expand all
1728 1736
1729 EXPECT_TRUE(audio_read_done); 1737 EXPECT_TRUE(audio_read_done);
1730 EXPECT_TRUE(video_read_done); 1738 EXPECT_TRUE(video_read_done);
1731 EXPECT_TRUE(text_read_done); 1739 EXPECT_TRUE(text_read_done);
1732 } 1740 }
1733 1741
1734 // Test that Seek() completes successfully when the first cluster 1742 // Test that Seek() completes successfully when the first cluster
1735 // arrives. 1743 // arrives.
1736 TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) { 1744 TEST_F(ChunkDemuxerTest, AppendDataAfterSeek) {
1737 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1745 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1738 AppendCluster(kDefaultFirstCluster()); 1746 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1739 1747
1740 InSequence s; 1748 InSequence s;
1741 1749
1742 EXPECT_CALL(*this, Checkpoint(1)); 1750 EXPECT_CALL(*this, Checkpoint(1));
1743 1751
1744 Seek(base::TimeDelta::FromMilliseconds(46)); 1752 Seek(base::TimeDelta::FromMilliseconds(46));
1745 1753
1746 EXPECT_CALL(*this, Checkpoint(2)); 1754 EXPECT_CALL(*this, Checkpoint(2));
1747 1755
1748 Checkpoint(1); 1756 Checkpoint(1);
1749 1757
1750 AppendCluster(kDefaultSecondCluster()); 1758 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
1751 1759
1752 message_loop_.RunUntilIdle(); 1760 message_loop_.RunUntilIdle();
1753 1761
1754 Checkpoint(2); 1762 Checkpoint(2);
1755 } 1763 }
1756 1764
1757 // Test that parsing errors are handled for clusters appended after init. 1765 // Test that parsing errors are handled for clusters appended after init.
1758 TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) { 1766 TEST_F(ChunkDemuxerTest, ErrorWhileParsingClusterAfterInit) {
1759 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1767 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1760 AppendCluster(kDefaultFirstCluster()); 1768 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1761 1769
1762 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1770 EXPECT_MEDIA_LOG(StreamParsingFailed());
1763 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED)); 1771 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
1764 AppendGarbage(); 1772 AppendGarbage();
1765 } 1773 }
1766 1774
1767 // Test the case where a Seek() is requested while the parser 1775 // Test the case where a Seek() is requested while the parser
1768 // is in the middle of cluster. This is to verify that the parser 1776 // is in the middle of cluster. This is to verify that the parser
1769 // does not reset itself on a seek. 1777 // does not reset itself on a seek.
1770 TEST_F(ChunkDemuxerTest, SeekWhileParsingCluster) { 1778 TEST_F(ChunkDemuxerTest, SeekWhileParsingCluster) {
1771 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1779 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1772 1780
1773 InSequence s; 1781 InSequence s;
1774 1782
1775 std::unique_ptr<Cluster> cluster_a(GenerateCluster(0, 6)); 1783 std::unique_ptr<Cluster> cluster_a(GenerateCluster(0, 6));
1776 1784
1777 // Split the cluster into two appends at an arbitrary point near the end. 1785 // Split the cluster into two appends at an arbitrary point near the end.
1778 int first_append_size = cluster_a->size() - 11; 1786 int first_append_size = cluster_a->size() - 11;
1779 int second_append_size = cluster_a->size() - first_append_size; 1787 int second_append_size = cluster_a->size() - first_append_size;
1780 1788
1781 // Append the first part of the cluster. 1789 // Append the first part of the cluster.
1782 AppendData(cluster_a->data(), first_append_size); 1790 ASSERT_TRUE(AppendData(cluster_a->data(), first_append_size));
1783 1791
1784 ExpectRead(DemuxerStream::AUDIO, 0); 1792 ExpectRead(DemuxerStream::AUDIO, 0);
1785 ExpectRead(DemuxerStream::VIDEO, 0); 1793 ExpectRead(DemuxerStream::VIDEO, 0);
1786 ExpectRead(DemuxerStream::AUDIO, kAudioBlockDuration); 1794 ExpectRead(DemuxerStream::AUDIO, kAudioBlockDuration);
1787 1795
1788 Seek(base::TimeDelta::FromSeconds(5)); 1796 Seek(base::TimeDelta::FromSeconds(5));
1789 1797
1790 // Append the rest of the cluster. 1798 // Append the rest of the cluster.
1791 AppendData(cluster_a->data() + first_append_size, second_append_size); 1799 ASSERT_TRUE(
1800 AppendData(cluster_a->data() + first_append_size, second_append_size));
1792 1801
1793 // Append the new cluster and verify that only the blocks 1802 // Append the new cluster and verify that only the blocks
1794 // in the new cluster are returned. 1803 // in the new cluster are returned.
1795 AppendCluster(GenerateCluster(5000, 6)); 1804 ASSERT_TRUE(AppendCluster(GenerateCluster(5000, 6)));
1796 GenerateExpectedReads(5000, 6); 1805 GenerateExpectedReads(5000, 6);
1797 } 1806 }
1798 1807
1799 // Test the case where AppendData() is called before Init(). 1808 // Test the case where AppendData() is called before Init().
1800 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) { 1809 TEST_F(ChunkDemuxerTest, AppendDataBeforeInit) {
1801 std::unique_ptr<uint8_t[]> info_tracks; 1810 std::unique_ptr<uint8_t[]> info_tracks;
1802 int info_tracks_size = 0; 1811 int info_tracks_size = 0;
1803 CreateInitSegment(HAS_AUDIO | HAS_VIDEO, 1812 CreateInitSegment(HAS_AUDIO | HAS_VIDEO,
1804 false, false, &info_tracks, &info_tracks_size); 1813 false, false, &info_tracks, &info_tracks_size);
1805 demuxer_->AppendData(kSourceId, info_tracks.get(), info_tracks_size, 1814 ASSERT_FALSE(demuxer_->AppendData(
1806 append_window_start_for_next_append_, 1815 kSourceId, info_tracks.get(), info_tracks_size,
1807 append_window_end_for_next_append_, 1816 append_window_start_for_next_append_, append_window_end_for_next_append_,
1808 &timestamp_offset_map_[kSourceId]); 1817 &timestamp_offset_map_[kSourceId]));
1809 } 1818 }
1810 1819
1811 // Make sure Read() callbacks are dispatched with the proper data. 1820 // Make sure Read() callbacks are dispatched with the proper data.
1812 TEST_F(ChunkDemuxerTest, Read) { 1821 TEST_F(ChunkDemuxerTest, Read) {
1813 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1822 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1814 1823
1815 AppendCluster(kDefaultFirstCluster()); 1824 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1816 1825
1817 bool audio_read_done = false; 1826 bool audio_read_done = false;
1818 bool video_read_done = false; 1827 bool video_read_done = false;
1819 ReadAudio(base::Bind(&OnReadDone, 1828 ReadAudio(base::Bind(&OnReadDone,
1820 base::TimeDelta::FromMilliseconds(0), 1829 base::TimeDelta::FromMilliseconds(0),
1821 &audio_read_done)); 1830 &audio_read_done));
1822 ReadVideo(base::Bind(&OnReadDone, 1831 ReadVideo(base::Bind(&OnReadDone,
1823 base::TimeDelta::FromMilliseconds(0), 1832 base::TimeDelta::FromMilliseconds(0),
1824 &video_read_done)); 1833 &video_read_done));
1825 1834
1826 EXPECT_TRUE(audio_read_done); 1835 EXPECT_TRUE(audio_read_done);
1827 EXPECT_TRUE(video_read_done); 1836 EXPECT_TRUE(video_read_done);
1828 } 1837 }
1829 1838
1830 TEST_F(ChunkDemuxerTest, OutOfOrderClusters) { 1839 TEST_F(ChunkDemuxerTest, OutOfOrderClusters) {
1831 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1840 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1832 AppendCluster(kDefaultFirstCluster()); 1841 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1833 EXPECT_MEDIA_LOG(GeneratedSplice(13000, 10000)); 1842 EXPECT_MEDIA_LOG(GeneratedSplice(13000, 10000));
1834 AppendCluster(GenerateCluster(10, 4)); 1843 ASSERT_TRUE(AppendCluster(GenerateCluster(10, 4)));
1835 1844
1836 // Make sure that AppendCluster() does not fail with a cluster that has 1845 // Make sure that AppendCluster() does not fail with a cluster that has
1837 // overlaps with the previously appended cluster. 1846 // overlaps with the previously appended cluster.
1838 EXPECT_MEDIA_LOG(SkippingSpliceAlreadySpliced(0)); 1847 EXPECT_MEDIA_LOG(SkippingSpliceAlreadySpliced(0));
1839 AppendCluster(GenerateCluster(5, 4)); 1848 ASSERT_TRUE(AppendCluster(GenerateCluster(5, 4)));
1840 1849
1841 // Verify that AppendData() can still accept more data. 1850 // Verify that AppendData() can still accept more data.
1842 std::unique_ptr<Cluster> cluster_c(GenerateCluster(45, 2)); 1851 std::unique_ptr<Cluster> cluster_c(GenerateCluster(45, 2));
1843 EXPECT_MEDIA_LOG(GeneratedSplice(6000, 45000)); 1852 EXPECT_MEDIA_LOG(GeneratedSplice(6000, 45000));
1844 demuxer_->AppendData(kSourceId, cluster_c->data(), cluster_c->size(), 1853 ASSERT_TRUE(demuxer_->AppendData(
1845 append_window_start_for_next_append_, 1854 kSourceId, cluster_c->data(), cluster_c->size(),
1846 append_window_end_for_next_append_, 1855 append_window_start_for_next_append_, append_window_end_for_next_append_,
1847 &timestamp_offset_map_[kSourceId]); 1856 &timestamp_offset_map_[kSourceId]));
1848 } 1857 }
1849 1858
1850 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) { 1859 TEST_F(ChunkDemuxerTest, NonMonotonicButAboveClusterTimecode) {
1851 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1860 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1852 AppendCluster(kDefaultFirstCluster()); 1861 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1853 1862
1854 ClusterBuilder cb; 1863 ClusterBuilder cb;
1855 1864
1856 // Test the case where block timecodes are not monotonically 1865 // Test the case where block timecodes are not monotonically
1857 // increasing but stay above the cluster timecode. 1866 // increasing but stay above the cluster timecode.
1858 cb.SetClusterTimecode(5); 1867 cb.SetClusterTimecode(5);
1859 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1868 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1860 AddSimpleBlock(&cb, kVideoTrackNum, 10); 1869 AddSimpleBlock(&cb, kVideoTrackNum, 10);
1861 AddSimpleBlock(&cb, kAudioTrackNum, 7); 1870 AddSimpleBlock(&cb, kAudioTrackNum, 7);
1862 AddSimpleBlock(&cb, kVideoTrackNum, 15); 1871 AddSimpleBlock(&cb, kVideoTrackNum, 15);
1863 1872
1864 EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode()); 1873 EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode());
1865 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1874 EXPECT_MEDIA_LOG(StreamParsingFailed());
1866 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED)); 1875 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
1867 AppendCluster(cb.Finish()); 1876 ASSERT_FALSE(AppendCluster(cb.Finish()));
1868 1877
1869 // Verify that AppendData() ignores data after the error. 1878 // Verify that AppendData() ignores data after the error.
1870 std::unique_ptr<Cluster> cluster_b(GenerateCluster(20, 2)); 1879 std::unique_ptr<Cluster> cluster_b(GenerateCluster(20, 2));
1871 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), 1880 ASSERT_FALSE(demuxer_->AppendData(
1872 append_window_start_for_next_append_, 1881 kSourceId, cluster_b->data(), cluster_b->size(),
1873 append_window_end_for_next_append_, 1882 append_window_start_for_next_append_, append_window_end_for_next_append_,
1874 &timestamp_offset_map_[kSourceId]); 1883 &timestamp_offset_map_[kSourceId]));
1875 } 1884 }
1876 1885
1877 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) { 1886 TEST_F(ChunkDemuxerTest, BackwardsAndBeforeClusterTimecode) {
1878 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1887 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1879 AppendCluster(kDefaultFirstCluster()); 1888 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1880 1889
1881 ClusterBuilder cb; 1890 ClusterBuilder cb;
1882 1891
1883 // Test timecodes going backwards and including values less than the cluster 1892 // Test timecodes going backwards and including values less than the cluster
1884 // timecode. 1893 // timecode.
1885 cb.SetClusterTimecode(5); 1894 cb.SetClusterTimecode(5);
1886 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1895 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1887 AddSimpleBlock(&cb, kVideoTrackNum, 5); 1896 AddSimpleBlock(&cb, kVideoTrackNum, 5);
1888 AddSimpleBlock(&cb, kAudioTrackNum, 3); 1897 AddSimpleBlock(&cb, kAudioTrackNum, 3);
1889 AddSimpleBlock(&cb, kVideoTrackNum, 3); 1898 AddSimpleBlock(&cb, kVideoTrackNum, 3);
1890 1899
1891 EXPECT_MEDIA_LOG(WebMNegativeTimecodeOffset("-2")); 1900 EXPECT_MEDIA_LOG(WebMNegativeTimecodeOffset("-2"));
1892 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1901 EXPECT_MEDIA_LOG(StreamParsingFailed());
1893 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED)); 1902 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
1894 AppendCluster(cb.Finish()); 1903 ASSERT_FALSE(AppendCluster(cb.Finish()));
1895 1904
1896 // Verify that AppendData() ignores data after the error. 1905 // Verify that AppendData() ignores data after the error.
1897 std::unique_ptr<Cluster> cluster_b(GenerateCluster(6, 2)); 1906 std::unique_ptr<Cluster> cluster_b(GenerateCluster(6, 2));
1898 demuxer_->AppendData(kSourceId, cluster_b->data(), cluster_b->size(), 1907 ASSERT_FALSE(demuxer_->AppendData(
1899 append_window_start_for_next_append_, 1908 kSourceId, cluster_b->data(), cluster_b->size(),
1900 append_window_end_for_next_append_, 1909 append_window_start_for_next_append_, append_window_end_for_next_append_,
1901 &timestamp_offset_map_[kSourceId]); 1910 &timestamp_offset_map_[kSourceId]));
1902 } 1911 }
1903 1912
1904 1913
1905 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) { 1914 TEST_F(ChunkDemuxerTest, PerStreamMonotonicallyIncreasingTimestamps) {
1906 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1915 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1907 AppendCluster(kDefaultFirstCluster()); 1916 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1908 1917
1909 ClusterBuilder cb; 1918 ClusterBuilder cb;
1910 1919
1911 // Test monotonic increasing timestamps on a per stream 1920 // Test monotonic increasing timestamps on a per stream
1912 // basis. 1921 // basis.
1913 cb.SetClusterTimecode(4); 1922 cb.SetClusterTimecode(4);
1914 AddSimpleBlock(&cb, kAudioTrackNum, 5); 1923 AddSimpleBlock(&cb, kAudioTrackNum, 5);
1915 AddSimpleBlock(&cb, kVideoTrackNum, 5); 1924 AddSimpleBlock(&cb, kVideoTrackNum, 5);
1916 AddSimpleBlock(&cb, kAudioTrackNum, 4); 1925 AddSimpleBlock(&cb, kAudioTrackNum, 4);
1917 AddSimpleBlock(&cb, kVideoTrackNum, 7); 1926 AddSimpleBlock(&cb, kVideoTrackNum, 7);
1918 1927
1919 EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode()); 1928 EXPECT_MEDIA_LOG(WebMOutOfOrderTimecode());
1920 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1929 EXPECT_MEDIA_LOG(StreamParsingFailed());
1921 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED)); 1930 EXPECT_CALL(host_, OnDemuxerError(CHUNK_DEMUXER_ERROR_APPEND_FAILED));
1922 AppendCluster(cb.Finish()); 1931 ASSERT_FALSE(AppendCluster(cb.Finish()));
1923 } 1932 }
1924 1933
1925 // Test the case where a cluster is passed to AppendCluster() before 1934 // Test the case where a cluster is passed to AppendCluster() before
1926 // INFO & TRACKS data. 1935 // INFO & TRACKS data.
1927 TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) { 1936 TEST_F(ChunkDemuxerTest, ClusterBeforeInitSegment) {
1928 EXPECT_CALL(*this, DemuxerOpened()); 1937 EXPECT_CALL(*this, DemuxerOpened());
1929 demuxer_->Initialize( 1938 demuxer_->Initialize(
1930 &host_, NewExpectedStatusCB(CHUNK_DEMUXER_ERROR_APPEND_FAILED), true); 1939 &host_, NewExpectedStatusCB(CHUNK_DEMUXER_ERROR_APPEND_FAILED), true);
1931 1940
1932 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 1941 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
1933 1942
1934 EXPECT_MEDIA_LOG(WebMClusterBeforeFirstInfo()); 1943 EXPECT_MEDIA_LOG(WebMClusterBeforeFirstInfo());
1935 EXPECT_MEDIA_LOG(StreamParsingFailed()); 1944 EXPECT_MEDIA_LOG(StreamParsingFailed());
1936 AppendCluster(GenerateCluster(0, 1)); 1945 ASSERT_FALSE(AppendCluster(GenerateCluster(0, 1)));
1937 } 1946 }
1938 1947
1939 // Test cases where we get an MarkEndOfStream() call during initialization. 1948 // Test cases where we get an MarkEndOfStream() call during initialization.
1940 TEST_F(ChunkDemuxerTest, EOSDuringInit) { 1949 TEST_F(ChunkDemuxerTest, EOSDuringInit) {
1941 EXPECT_CALL(*this, DemuxerOpened()); 1950 EXPECT_CALL(*this, DemuxerOpened());
1942 demuxer_->Initialize( 1951 demuxer_->Initialize(
1943 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); 1952 &host_, NewExpectedStatusCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
1944 MarkEndOfStream(PIPELINE_OK); 1953 MarkEndOfStream(PIPELINE_OK);
1945 } 1954 }
1946 1955
(...skipping 16 matching lines...) Expand all
1963 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1972 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1964 1973
1965 CheckExpectedRanges("{ }"); 1974 CheckExpectedRanges("{ }");
1966 MarkEndOfStream(PIPELINE_OK); 1975 MarkEndOfStream(PIPELINE_OK);
1967 CheckExpectedRanges("{ }"); 1976 CheckExpectedRanges("{ }");
1968 } 1977 }
1969 1978
1970 TEST_F(ChunkDemuxerTest, DecodeErrorEndOfStream) { 1979 TEST_F(ChunkDemuxerTest, DecodeErrorEndOfStream) {
1971 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1980 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1972 1981
1973 AppendCluster(kDefaultFirstCluster()); 1982 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1974 CheckExpectedRanges(kDefaultFirstClusterRange); 1983 CheckExpectedRanges(kDefaultFirstClusterRange);
1975 1984
1976 EXPECT_CALL(host_, 1985 EXPECT_CALL(host_,
1977 OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR)); 1986 OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR));
1978 MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR); 1987 MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR);
1979 CheckExpectedRanges(kDefaultFirstClusterRange); 1988 CheckExpectedRanges(kDefaultFirstClusterRange);
1980 } 1989 }
1981 1990
1982 TEST_F(ChunkDemuxerTest, NetworkErrorEndOfStream) { 1991 TEST_F(ChunkDemuxerTest, NetworkErrorEndOfStream) {
1983 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 1992 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
1984 1993
1985 AppendCluster(kDefaultFirstCluster()); 1994 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
1986 CheckExpectedRanges(kDefaultFirstClusterRange); 1995 CheckExpectedRanges(kDefaultFirstClusterRange);
1987 1996
1988 EXPECT_CALL(host_, 1997 EXPECT_CALL(host_,
1989 OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR)); 1998 OnDemuxerError(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR));
1990 MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR); 1999 MarkEndOfStream(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR);
1991 } 2000 }
1992 2001
1993 // Helper class to reduce duplicate code when testing end of stream 2002 // Helper class to reduce duplicate code when testing end of stream
1994 // Read() behavior. 2003 // Read() behavior.
1995 class EndOfStreamHelper { 2004 class EndOfStreamHelper {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2036 bool video_read_done_; 2045 bool video_read_done_;
2037 2046
2038 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper); 2047 DISALLOW_COPY_AND_ASSIGN(EndOfStreamHelper);
2039 }; 2048 };
2040 2049
2041 // Make sure that all pending reads that we don't have media data for get an 2050 // Make sure that all pending reads that we don't have media data for get an
2042 // "end of stream" buffer when MarkEndOfStream() is called. 2051 // "end of stream" buffer when MarkEndOfStream() is called.
2043 TEST_F(ChunkDemuxerTest, EndOfStreamWithPendingReads) { 2052 TEST_F(ChunkDemuxerTest, EndOfStreamWithPendingReads) {
2044 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2053 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2045 2054
2046 AppendCluster(GenerateCluster(0, 2)); 2055 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 2)));
2047 2056
2048 bool audio_read_done_1 = false; 2057 bool audio_read_done_1 = false;
2049 bool video_read_done_1 = false; 2058 bool video_read_done_1 = false;
2050 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 2059 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
2051 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 2060 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
2052 2061
2053 ReadAudio(base::Bind(&OnReadDone, 2062 ReadAudio(base::Bind(&OnReadDone,
2054 base::TimeDelta::FromMilliseconds(0), 2063 base::TimeDelta::FromMilliseconds(0),
2055 &audio_read_done_1)); 2064 &audio_read_done_1));
2056 ReadVideo(base::Bind(&OnReadDone, 2065 ReadVideo(base::Bind(&OnReadDone,
(...skipping 14 matching lines...) Expand all
2071 2080
2072 end_of_stream_helper_2.RequestReads(); 2081 end_of_stream_helper_2.RequestReads();
2073 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 2082 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
2074 } 2083 }
2075 2084
2076 // Make sure that all Read() calls after we get an MarkEndOfStream() 2085 // Make sure that all Read() calls after we get an MarkEndOfStream()
2077 // call return an "end of stream" buffer. 2086 // call return an "end of stream" buffer.
2078 TEST_F(ChunkDemuxerTest, ReadsAfterEndOfStream) { 2087 TEST_F(ChunkDemuxerTest, ReadsAfterEndOfStream) {
2079 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2088 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2080 2089
2081 AppendCluster(GenerateCluster(0, 2)); 2090 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 2)));
2082 2091
2083 bool audio_read_done_1 = false; 2092 bool audio_read_done_1 = false;
2084 bool video_read_done_1 = false; 2093 bool video_read_done_1 = false;
2085 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get()); 2094 EndOfStreamHelper end_of_stream_helper_1(demuxer_.get());
2086 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get()); 2095 EndOfStreamHelper end_of_stream_helper_2(demuxer_.get());
2087 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get()); 2096 EndOfStreamHelper end_of_stream_helper_3(demuxer_.get());
2088 2097
2089 ReadAudio(base::Bind(&OnReadDone, 2098 ReadAudio(base::Bind(&OnReadDone,
2090 base::TimeDelta::FromMilliseconds(0), 2099 base::TimeDelta::FromMilliseconds(0),
2091 &audio_read_done_1)); 2100 &audio_read_done_1));
(...skipping 18 matching lines...) Expand all
2110 end_of_stream_helper_2.RequestReads(); 2119 end_of_stream_helper_2.RequestReads();
2111 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true); 2120 end_of_stream_helper_2.CheckIfReadDonesWereCalled(true);
2112 2121
2113 end_of_stream_helper_3.RequestReads(); 2122 end_of_stream_helper_3.RequestReads();
2114 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true); 2123 end_of_stream_helper_3.CheckIfReadDonesWereCalled(true);
2115 } 2124 }
2116 2125
2117 TEST_F(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) { 2126 TEST_F(ChunkDemuxerTest, EndOfStreamDuringCanceledSeek) {
2118 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2127 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2119 2128
2120 AppendCluster(0, 10); 2129 ASSERT_TRUE(AppendCluster(0, 10));
2121 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138))); 2130 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(138)));
2122 MarkEndOfStream(PIPELINE_OK); 2131 MarkEndOfStream(PIPELINE_OK);
2123 2132
2124 // Start the first seek. 2133 // Start the first seek.
2125 Seek(base::TimeDelta::FromMilliseconds(20)); 2134 Seek(base::TimeDelta::FromMilliseconds(20));
2126 2135
2127 // Simulate another seek being requested before the first 2136 // Simulate another seek being requested before the first
2128 // seek has finished prerolling. 2137 // seek has finished prerolling.
2129 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(30); 2138 base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(30);
2130 demuxer_->CancelPendingSeek(seek_time2); 2139 demuxer_->CancelPendingSeek(seek_time2);
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
2209 dst += info_tracks_size; 2218 dst += info_tracks_size;
2210 2219
2211 memcpy(dst, cluster_a->data(), cluster_a->size()); 2220 memcpy(dst, cluster_a->data(), cluster_a->size());
2212 dst += cluster_a->size(); 2221 dst += cluster_a->size();
2213 2222
2214 memcpy(dst, cluster_b->data(), cluster_b->size()); 2223 memcpy(dst, cluster_b->data(), cluster_b->size());
2215 dst += cluster_b->size(); 2224 dst += cluster_b->size();
2216 2225
2217 ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO); 2226 ExpectInitMediaLogs(HAS_AUDIO | HAS_VIDEO);
2218 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 2227 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2219 AppendDataInPieces(buffer.get(), buffer_size); 2228 ASSERT_TRUE(AppendDataInPieces(buffer.get(), buffer_size));
2220 2229
2221 GenerateExpectedReads(0, 9); 2230 GenerateExpectedReads(0, 9);
2222 } 2231 }
2223 2232
2224 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) { 2233 TEST_F(ChunkDemuxerTest, WebMFile_AudioAndVideo) {
2225 struct BufferTimestamps buffer_timestamps[] = { 2234 struct BufferTimestamps buffer_timestamps[] = {
2226 {0, 0}, 2235 {0, 0},
2227 {33, 3}, 2236 {33, 3},
2228 {67, 6}, 2237 {67, 6},
2229 {100, 9}, 2238 {100, 9},
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
2341 base::TimeDelta::FromMilliseconds(0), 2350 base::TimeDelta::FromMilliseconds(0),
2342 &video_read_done)); 2351 &video_read_done));
2343 2352
2344 // Make sure the reads haven't completed yet. 2353 // Make sure the reads haven't completed yet.
2345 EXPECT_FALSE(audio_read_done); 2354 EXPECT_FALSE(audio_read_done);
2346 EXPECT_FALSE(video_read_done); 2355 EXPECT_FALSE(video_read_done);
2347 2356
2348 // Append data one byte at a time until one or both reads complete. 2357 // Append data one byte at a time until one or both reads complete.
2349 int i = 0; 2358 int i = 0;
2350 for (; i < cluster->size() && !(audio_read_done || video_read_done); ++i) { 2359 for (; i < cluster->size() && !(audio_read_done || video_read_done); ++i) {
2351 AppendData(cluster->data() + i, 1); 2360 ASSERT_TRUE(AppendData(cluster->data() + i, 1));
2352 message_loop_.RunUntilIdle(); 2361 message_loop_.RunUntilIdle();
2353 } 2362 }
2354 2363
2355 EXPECT_TRUE(audio_read_done || video_read_done); 2364 EXPECT_TRUE(audio_read_done || video_read_done);
2356 EXPECT_GT(i, 0); 2365 EXPECT_GT(i, 0);
2357 EXPECT_LT(i, cluster->size()); 2366 EXPECT_LT(i, cluster->size());
2358 2367
2359 audio_read_done = false; 2368 audio_read_done = false;
2360 video_read_done = false; 2369 video_read_done = false;
2361 ReadAudio(base::Bind(&OnReadDone, 2370 ReadAudio(base::Bind(&OnReadDone,
2362 base::TimeDelta::FromMilliseconds(23), 2371 base::TimeDelta::FromMilliseconds(23),
2363 &audio_read_done)); 2372 &audio_read_done));
2364 ReadVideo(base::Bind(&OnReadDone, 2373 ReadVideo(base::Bind(&OnReadDone,
2365 base::TimeDelta::FromMilliseconds(33), 2374 base::TimeDelta::FromMilliseconds(33),
2366 &video_read_done)); 2375 &video_read_done));
2367 2376
2368 // Make sure the reads haven't completed yet. 2377 // Make sure the reads haven't completed yet.
2369 EXPECT_FALSE(audio_read_done); 2378 EXPECT_FALSE(audio_read_done);
2370 EXPECT_FALSE(video_read_done); 2379 EXPECT_FALSE(video_read_done);
2371 2380
2372 // Append the remaining data. 2381 // Append the remaining data.
2373 ASSERT_LT(i, cluster->size()); 2382 ASSERT_LT(i, cluster->size());
2374 AppendData(cluster->data() + i, cluster->size() - i); 2383 ASSERT_TRUE(AppendData(cluster->data() + i, cluster->size() - i));
2375 2384
2376 message_loop_.RunUntilIdle(); 2385 message_loop_.RunUntilIdle();
2377 2386
2378 EXPECT_TRUE(audio_read_done); 2387 EXPECT_TRUE(audio_read_done);
2379 EXPECT_TRUE(video_read_done); 2388 EXPECT_TRUE(video_read_done);
2380 } 2389 }
2381 2390
2382 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) { 2391 TEST_F(ChunkDemuxerTest, ParseErrorDuringInit) {
2383 EXPECT_CALL(*this, DemuxerOpened()); 2392 EXPECT_CALL(*this, DemuxerOpened());
2384 demuxer_->Initialize( 2393 demuxer_->Initialize(
2385 &host_, 2394 &host_,
2386 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2395 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2387 true); 2396 true);
2388 2397
2389 ASSERT_EQ(AddId(), ChunkDemuxer::kOk); 2398 ASSERT_EQ(AddId(), ChunkDemuxer::kOk);
2390 2399
2391 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2400 EXPECT_MEDIA_LOG(StreamParsingFailed());
2392 uint8_t tmp = 0; 2401 uint8_t tmp = 0;
2393 demuxer_->AppendData(kSourceId, &tmp, 1, append_window_start_for_next_append_, 2402 ASSERT_FALSE(demuxer_->AppendData(
2394 append_window_end_for_next_append_, 2403 kSourceId, &tmp, 1, append_window_start_for_next_append_,
2395 &timestamp_offset_map_[kSourceId]); 2404 append_window_end_for_next_append_, &timestamp_offset_map_[kSourceId]));
2396 } 2405 }
2397 2406
2398 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { 2407 TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) {
2399 EXPECT_CALL(*this, DemuxerOpened()); 2408 EXPECT_CALL(*this, DemuxerOpened());
2400 demuxer_->Initialize( 2409 demuxer_->Initialize(
2401 &host_, 2410 &host_,
2402 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2411 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2403 true); 2412 true);
2404 2413
2405 std::vector<std::string> codecs(1); 2414 std::vector<std::string> codecs(1);
2406 codecs[0] = "vorbis"; 2415 codecs[0] = "vorbis";
2407 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), 2416 ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs),
2408 ChunkDemuxer::kOk); 2417 ChunkDemuxer::kOk);
2409 demuxer_->SetTracksWatcher(kSourceId, 2418 demuxer_->SetTracksWatcher(kSourceId,
2410 base::Bind(&ChunkDemuxerTest::InitSegmentReceived, 2419 base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
2411 base::Unretained(this))); 2420 base::Unretained(this)));
2412 2421
2413 // Video track is unexpected per mimetype. 2422 // Video track is unexpected per mimetype.
2414 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", true)); 2423 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", true));
2415 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2424 EXPECT_MEDIA_LOG(StreamParsingFailed());
2416 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); 2425 ASSERT_FALSE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO));
2417 } 2426 }
2418 2427
2419 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { 2428 TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) {
2420 EXPECT_CALL(*this, DemuxerOpened()); 2429 EXPECT_CALL(*this, DemuxerOpened());
2421 demuxer_->Initialize( 2430 demuxer_->Initialize(
2422 &host_, 2431 &host_,
2423 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2432 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2424 true); 2433 true);
2425 2434
2426 std::vector<std::string> codecs(1); 2435 std::vector<std::string> codecs(1);
2427 codecs[0] = "vp8"; 2436 codecs[0] = "vp8";
2428 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), 2437 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
2429 ChunkDemuxer::kOk); 2438 ChunkDemuxer::kOk);
2430 demuxer_->SetTracksWatcher(kSourceId, 2439 demuxer_->SetTracksWatcher(kSourceId,
2431 base::Bind(&ChunkDemuxerTest::InitSegmentReceived, 2440 base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
2432 base::Unretained(this))); 2441 base::Unretained(this)));
2433 2442
2434 // Audio track is unexpected per mimetype. 2443 // Audio track is unexpected per mimetype.
2435 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", true)); 2444 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", true));
2436 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2445 EXPECT_MEDIA_LOG(StreamParsingFailed());
2437 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); 2446 ASSERT_FALSE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO));
2438 } 2447 }
2439 2448
2440 TEST_F(ChunkDemuxerTest, AudioOnlyHeaderWithAVType) { 2449 TEST_F(ChunkDemuxerTest, AudioOnlyHeaderWithAVType) {
2441 EXPECT_CALL(*this, DemuxerOpened()); 2450 EXPECT_CALL(*this, DemuxerOpened());
2442 demuxer_->Initialize( 2451 demuxer_->Initialize(
2443 &host_, 2452 &host_,
2444 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2453 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2445 true); 2454 true);
2446 2455
2447 std::vector<std::string> codecs(2); 2456 std::vector<std::string> codecs(2);
2448 codecs[0] = "vorbis"; 2457 codecs[0] = "vorbis";
2449 codecs[1] = "vp8"; 2458 codecs[1] = "vp8";
2450 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), 2459 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
2451 ChunkDemuxer::kOk); 2460 ChunkDemuxer::kOk);
2452 demuxer_->SetTracksWatcher(kSourceId, 2461 demuxer_->SetTracksWatcher(kSourceId,
2453 base::Bind(&ChunkDemuxerTest::InitSegmentReceived, 2462 base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
2454 base::Unretained(this))); 2463 base::Unretained(this)));
2455 2464
2456 // Video track is also expected per mimetype. 2465 // Video track is also expected per mimetype.
2457 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", false)); 2466 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", false));
2458 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2467 EXPECT_MEDIA_LOG(StreamParsingFailed());
2459 AppendInitSegment(HAS_AUDIO); 2468 ASSERT_FALSE(AppendInitSegment(HAS_AUDIO));
2460 } 2469 }
2461 2470
2462 TEST_F(ChunkDemuxerTest, VideoOnlyHeaderWithAVType) { 2471 TEST_F(ChunkDemuxerTest, VideoOnlyHeaderWithAVType) {
2463 EXPECT_CALL(*this, DemuxerOpened()); 2472 EXPECT_CALL(*this, DemuxerOpened());
2464 demuxer_->Initialize( 2473 demuxer_->Initialize(
2465 &host_, 2474 &host_,
2466 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED), 2475 CreateInitDoneCB(kNoTimestamp(), CHUNK_DEMUXER_ERROR_APPEND_FAILED),
2467 true); 2476 true);
2468 2477
2469 std::vector<std::string> codecs(2); 2478 std::vector<std::string> codecs(2);
2470 codecs[0] = "vorbis"; 2479 codecs[0] = "vorbis";
2471 codecs[1] = "vp8"; 2480 codecs[1] = "vp8";
2472 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), 2481 ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs),
2473 ChunkDemuxer::kOk); 2482 ChunkDemuxer::kOk);
2474 demuxer_->SetTracksWatcher(kSourceId, 2483 demuxer_->SetTracksWatcher(kSourceId,
2475 base::Bind(&ChunkDemuxerTest::InitSegmentReceived, 2484 base::Bind(&ChunkDemuxerTest::InitSegmentReceived,
2476 base::Unretained(this))); 2485 base::Unretained(this)));
2477 2486
2478 // Audio track is also expected per mimetype. 2487 // Audio track is also expected per mimetype.
2479 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", false)); 2488 EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", false));
2480 EXPECT_MEDIA_LOG(StreamParsingFailed()); 2489 EXPECT_MEDIA_LOG(StreamParsingFailed());
2481 AppendInitSegment(HAS_VIDEO); 2490 ASSERT_FALSE(AppendInitSegment(HAS_VIDEO));
2482 } 2491 }
2483 2492
2484 TEST_F(ChunkDemuxerTest, MultipleHeaders) { 2493 TEST_F(ChunkDemuxerTest, MultipleHeaders) {
2485 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2494 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2486 2495
2487 AppendCluster(kDefaultFirstCluster()); 2496 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
2488 2497
2489 // Append another identical initialization segment. 2498 // Append another identical initialization segment.
2490 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 2499 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2491 AppendInitSegment(HAS_AUDIO | HAS_VIDEO); 2500 ASSERT_TRUE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO));
2492 2501
2493 AppendCluster(kDefaultSecondCluster()); 2502 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
2494 2503
2495 GenerateExpectedReads(0, 9); 2504 GenerateExpectedReads(0, 9);
2496 } 2505 }
2497 2506
2498 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) { 2507 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideo) {
2499 std::string audio_id = "audio1"; 2508 std::string audio_id = "audio1";
2500 std::string video_id = "video1"; 2509 std::string video_id = "video1";
2501 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2510 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2502 2511
2503 // Append audio and video data into separate source ids. 2512 // Append audio and video data into separate source ids.
2504 AppendCluster(audio_id, 2513 ASSERT_TRUE(AppendCluster(
2505 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2514 audio_id,
2515 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2506 GenerateAudioStreamExpectedReads(0, 4); 2516 GenerateAudioStreamExpectedReads(0, 4);
2507 AppendCluster(video_id, 2517 ASSERT_TRUE(AppendCluster(video_id,
2508 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2518 GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2519 kVideoBlockDuration)));
2509 GenerateVideoStreamExpectedReads(0, 4); 2520 GenerateVideoStreamExpectedReads(0, 4);
2510 } 2521 }
2511 2522
2512 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) { 2523 TEST_F(ChunkDemuxerTest, AddSeparateSourcesForAudioAndVideoText) {
2513 // TODO(matthewjheaney): Here and elsewhere, we need more tests 2524 // TODO(matthewjheaney): Here and elsewhere, we need more tests
2514 // for inband text tracks (http://crbug/321455). 2525 // for inband text tracks (http://crbug/321455).
2515 2526
2516 std::string audio_id = "audio1"; 2527 std::string audio_id = "audio1";
2517 std::string video_id = "video1"; 2528 std::string video_id = "video1";
2518 2529
2519 EXPECT_CALL(host_, AddTextStream(_, _)) 2530 EXPECT_CALL(host_, AddTextStream(_, _))
2520 .Times(Exactly(2)); 2531 .Times(Exactly(2));
2521 ASSERT_TRUE(InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, true)); 2532 ASSERT_TRUE(InitDemuxerAudioAndVideoSourcesText(audio_id, video_id, true));
2522 2533
2523 // Append audio and video data into separate source ids. 2534 // Append audio and video data into separate source ids.
2524 AppendCluster(audio_id, 2535 ASSERT_TRUE(AppendCluster(
2525 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2536 audio_id,
2537 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2526 GenerateAudioStreamExpectedReads(0, 4); 2538 GenerateAudioStreamExpectedReads(0, 4);
2527 AppendCluster(video_id, 2539 ASSERT_TRUE(AppendCluster(video_id,
2528 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2540 GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2541 kVideoBlockDuration)));
2529 GenerateVideoStreamExpectedReads(0, 4); 2542 GenerateVideoStreamExpectedReads(0, 4);
2530 } 2543 }
2531 2544
2532 TEST_F(ChunkDemuxerTest, AddIdFailures) { 2545 TEST_F(ChunkDemuxerTest, AddIdFailures) {
2533 EXPECT_CALL(*this, DemuxerOpened()); 2546 EXPECT_CALL(*this, DemuxerOpened());
2534 demuxer_->Initialize( 2547 demuxer_->Initialize(
2535 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); 2548 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
2536 2549
2537 std::string audio_id = "audio1"; 2550 std::string audio_id = "audio1";
2538 std::string video_id = "video1"; 2551 std::string video_id = "video1";
2539 2552
2540 ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk); 2553 ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk);
2541 2554
2542 // Adding an id with audio/video should fail because we already added audio. 2555 // Adding an id with audio/video should fail because we already added audio.
2543 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); 2556 ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit);
2544 2557
2545 ExpectInitMediaLogs(HAS_AUDIO); 2558 ExpectInitMediaLogs(HAS_AUDIO);
2546 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 2559 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2547 AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO); 2560 ASSERT_TRUE(AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO));
2548 2561
2549 // Adding an id after append should fail. 2562 // Adding an id after append should fail.
2550 ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit); 2563 ASSERT_EQ(AddId(video_id, HAS_VIDEO), ChunkDemuxer::kReachedIdLimit);
2551 } 2564 }
2552 2565
2553 // Test that Read() calls after a RemoveId() return "end of stream" buffers. 2566 // Test that Read() calls after a RemoveId() return "end of stream" buffers.
2554 TEST_F(ChunkDemuxerTest, RemoveId) { 2567 TEST_F(ChunkDemuxerTest, RemoveId) {
2555 std::string audio_id = "audio1"; 2568 std::string audio_id = "audio1";
2556 std::string video_id = "video1"; 2569 std::string video_id = "video1";
2557 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2570 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2558 2571
2559 // Append audio and video data into separate source ids. 2572 // Append audio and video data into separate source ids.
2560 AppendCluster(audio_id, 2573 ASSERT_TRUE(AppendCluster(
2561 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2574 audio_id,
2562 AppendCluster(video_id, 2575 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2563 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2576 ASSERT_TRUE(AppendCluster(video_id,
2577 GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2578 kVideoBlockDuration)));
2564 2579
2565 // Read() from audio should return normal buffers. 2580 // Read() from audio should return normal buffers.
2566 GenerateAudioStreamExpectedReads(0, 4); 2581 GenerateAudioStreamExpectedReads(0, 4);
2567 2582
2568 // Remove the audio id. 2583 // Remove the audio id.
2569 demuxer_->RemoveId(audio_id); 2584 demuxer_->RemoveId(audio_id);
2570 2585
2571 // Read() from audio should return "end of stream" buffers. 2586 // Read() from audio should return "end of stream" buffers.
2572 bool audio_read_done = false; 2587 bool audio_read_done = false;
2573 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); 2588 ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done));
(...skipping 12 matching lines...) Expand all
2586 demuxer_->RemoveId(audio_id_1); 2601 demuxer_->RemoveId(audio_id_1);
2587 2602
2588 std::string audio_id_2 = "audio2"; 2603 std::string audio_id_2 = "audio2";
2589 ASSERT_TRUE(AddId(audio_id_2, HAS_AUDIO) == ChunkDemuxer::kOk); 2604 ASSERT_TRUE(AddId(audio_id_2, HAS_AUDIO) == ChunkDemuxer::kOk);
2590 } 2605 }
2591 2606
2592 TEST_F(ChunkDemuxerTest, SeekCanceled) { 2607 TEST_F(ChunkDemuxerTest, SeekCanceled) {
2593 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2608 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2594 2609
2595 // Append cluster at the beginning of the stream. 2610 // Append cluster at the beginning of the stream.
2596 AppendCluster(GenerateCluster(0, 4)); 2611 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 4)));
2597 2612
2598 // Seek to an unbuffered region. 2613 // Seek to an unbuffered region.
2599 Seek(base::TimeDelta::FromSeconds(50)); 2614 Seek(base::TimeDelta::FromSeconds(50));
2600 2615
2601 // Attempt to read in unbuffered area; should not fulfill the read. 2616 // Attempt to read in unbuffered area; should not fulfill the read.
2602 bool audio_read_done = false; 2617 bool audio_read_done = false;
2603 bool video_read_done = false; 2618 bool video_read_done = false;
2604 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); 2619 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
2605 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); 2620 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
2606 EXPECT_FALSE(audio_read_done); 2621 EXPECT_FALSE(audio_read_done);
2607 EXPECT_FALSE(video_read_done); 2622 EXPECT_FALSE(video_read_done);
2608 2623
2609 // Now cancel the pending seek, which should flush the reads with empty 2624 // Now cancel the pending seek, which should flush the reads with empty
2610 // buffers. 2625 // buffers.
2611 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); 2626 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
2612 demuxer_->CancelPendingSeek(seek_time); 2627 demuxer_->CancelPendingSeek(seek_time);
2613 message_loop_.RunUntilIdle(); 2628 message_loop_.RunUntilIdle();
2614 EXPECT_TRUE(audio_read_done); 2629 EXPECT_TRUE(audio_read_done);
2615 EXPECT_TRUE(video_read_done); 2630 EXPECT_TRUE(video_read_done);
2616 2631
2617 // A seek back to the buffered region should succeed. 2632 // A seek back to the buffered region should succeed.
2618 Seek(seek_time); 2633 Seek(seek_time);
2619 GenerateExpectedReads(0, 4); 2634 GenerateExpectedReads(0, 4);
2620 } 2635 }
2621 2636
2622 TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) { 2637 TEST_F(ChunkDemuxerTest, SeekCanceledWhileWaitingForSeek) {
2623 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2638 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
2624 2639
2625 // Append cluster at the beginning of the stream. 2640 // Append cluster at the beginning of the stream.
2626 AppendCluster(GenerateCluster(0, 4)); 2641 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 4)));
2627 2642
2628 // Start waiting for a seek. 2643 // Start waiting for a seek.
2629 base::TimeDelta seek_time1 = base::TimeDelta::FromSeconds(50); 2644 base::TimeDelta seek_time1 = base::TimeDelta::FromSeconds(50);
2630 base::TimeDelta seek_time2 = base::TimeDelta::FromSeconds(0); 2645 base::TimeDelta seek_time2 = base::TimeDelta::FromSeconds(0);
2631 demuxer_->StartWaitingForSeek(seek_time1); 2646 demuxer_->StartWaitingForSeek(seek_time1);
2632 2647
2633 // Now cancel the upcoming seek to an unbuffered region. 2648 // Now cancel the upcoming seek to an unbuffered region.
2634 demuxer_->CancelPendingSeek(seek_time2); 2649 demuxer_->CancelPendingSeek(seek_time2);
2635 demuxer_->Seek(seek_time1, NewExpectedStatusCB(PIPELINE_OK)); 2650 demuxer_->Seek(seek_time1, NewExpectedStatusCB(PIPELINE_OK));
2636 2651
2637 // Read requests should be fulfilled with empty buffers. 2652 // Read requests should be fulfilled with empty buffers.
2638 bool audio_read_done = false; 2653 bool audio_read_done = false;
2639 bool video_read_done = false; 2654 bool video_read_done = false;
2640 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done)); 2655 ReadAudio(base::Bind(&OnReadDone_AbortExpected, &audio_read_done));
2641 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done)); 2656 ReadVideo(base::Bind(&OnReadDone_AbortExpected, &video_read_done));
2642 EXPECT_TRUE(audio_read_done); 2657 EXPECT_TRUE(audio_read_done);
2643 EXPECT_TRUE(video_read_done); 2658 EXPECT_TRUE(video_read_done);
2644 2659
2645 // A seek back to the buffered region should succeed. 2660 // A seek back to the buffered region should succeed.
2646 Seek(seek_time2); 2661 Seek(seek_time2);
2647 GenerateExpectedReads(0, 4); 2662 GenerateExpectedReads(0, 4);
2648 } 2663 }
2649 2664
2650 // Test that Seek() successfully seeks to all source IDs. 2665 // Test that Seek() successfully seeks to all source IDs.
2651 TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) { 2666 TEST_F(ChunkDemuxerTest, SeekAudioAndVideoSources) {
2652 std::string audio_id = "audio1"; 2667 std::string audio_id = "audio1";
2653 std::string video_id = "video1"; 2668 std::string video_id = "video1";
2654 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2669 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2655 2670
2656 AppendCluster( 2671 ASSERT_TRUE(AppendCluster(
2657 audio_id, 2672 audio_id,
2658 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2673 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2659 AppendCluster( 2674 ASSERT_TRUE(AppendCluster(video_id,
2660 video_id, 2675 GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2661 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2676 kVideoBlockDuration)));
2662 2677
2663 // Read() should return buffers at 0. 2678 // Read() should return buffers at 0.
2664 bool audio_read_done = false; 2679 bool audio_read_done = false;
2665 bool video_read_done = false; 2680 bool video_read_done = false;
2666 ReadAudio(base::Bind(&OnReadDone, 2681 ReadAudio(base::Bind(&OnReadDone,
2667 base::TimeDelta::FromMilliseconds(0), 2682 base::TimeDelta::FromMilliseconds(0),
2668 &audio_read_done)); 2683 &audio_read_done));
2669 ReadVideo(base::Bind(&OnReadDone, 2684 ReadVideo(base::Bind(&OnReadDone,
2670 base::TimeDelta::FromMilliseconds(0), 2685 base::TimeDelta::FromMilliseconds(0),
2671 &video_read_done)); 2686 &video_read_done));
2672 EXPECT_TRUE(audio_read_done); 2687 EXPECT_TRUE(audio_read_done);
2673 EXPECT_TRUE(video_read_done); 2688 EXPECT_TRUE(video_read_done);
2674 2689
2675 // Seek to 3 (an unbuffered region). 2690 // Seek to 3 (an unbuffered region).
2676 Seek(base::TimeDelta::FromSeconds(3)); 2691 Seek(base::TimeDelta::FromSeconds(3));
2677 2692
2678 audio_read_done = false; 2693 audio_read_done = false;
2679 video_read_done = false; 2694 video_read_done = false;
2680 ReadAudio(base::Bind(&OnReadDone, 2695 ReadAudio(base::Bind(&OnReadDone,
2681 base::TimeDelta::FromSeconds(3), 2696 base::TimeDelta::FromSeconds(3),
2682 &audio_read_done)); 2697 &audio_read_done));
2683 ReadVideo(base::Bind(&OnReadDone, 2698 ReadVideo(base::Bind(&OnReadDone,
2684 base::TimeDelta::FromSeconds(3), 2699 base::TimeDelta::FromSeconds(3),
2685 &video_read_done)); 2700 &video_read_done));
2686 // Read()s should not return until after data is appended at the Seek point. 2701 // Read()s should not return until after data is appended at the Seek point.
2687 EXPECT_FALSE(audio_read_done); 2702 EXPECT_FALSE(audio_read_done);
2688 EXPECT_FALSE(video_read_done); 2703 EXPECT_FALSE(video_read_done);
2689 2704
2690 AppendCluster(audio_id, 2705 ASSERT_TRUE(AppendCluster(
2691 GenerateSingleStreamCluster( 2706 audio_id, GenerateSingleStreamCluster(3000, 3092, kAudioTrackNum,
2692 3000, 3092, kAudioTrackNum, kAudioBlockDuration)); 2707 kAudioBlockDuration)));
2693 AppendCluster(video_id, 2708 ASSERT_TRUE(AppendCluster(
2694 GenerateSingleStreamCluster( 2709 video_id, GenerateSingleStreamCluster(3000, 3132, kVideoTrackNum,
2695 3000, 3132, kVideoTrackNum, kVideoBlockDuration)); 2710 kVideoBlockDuration)));
2696 2711
2697 message_loop_.RunUntilIdle(); 2712 message_loop_.RunUntilIdle();
2698 2713
2699 // Read() should return buffers at 3. 2714 // Read() should return buffers at 3.
2700 EXPECT_TRUE(audio_read_done); 2715 EXPECT_TRUE(audio_read_done);
2701 EXPECT_TRUE(video_read_done); 2716 EXPECT_TRUE(video_read_done);
2702 } 2717 }
2703 2718
2704 // Test that Seek() completes successfully when EndOfStream 2719 // Test that Seek() completes successfully when EndOfStream
2705 // is called before data is available for that seek point. 2720 // is called before data is available for that seek point.
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
2774 2789
2775 message_loop_.RunUntilIdle(); 2790 message_loop_.RunUntilIdle();
2776 2791
2777 EXPECT_TRUE(seek_cb_was_called); 2792 EXPECT_TRUE(seek_cb_was_called);
2778 2793
2779 ShutdownDemuxer(); 2794 ShutdownDemuxer();
2780 } 2795 }
2781 2796
2782 // Test ranges in an audio-only stream. 2797 // Test ranges in an audio-only stream.
2783 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) { 2798 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioIdOnly) {
2784 EXPECT_CALL(*this, DemuxerOpened()); 2799 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
2785 demuxer_->Initialize(
2786 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
2787
2788 ASSERT_EQ(AddId(kSourceId, HAS_AUDIO), ChunkDemuxer::kOk);
2789 ExpectInitMediaLogs(HAS_AUDIO);
2790 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2791 AppendInitSegment(HAS_AUDIO);
2792 2800
2793 // Test a simple cluster. 2801 // Test a simple cluster.
2794 AppendCluster( 2802 ASSERT_TRUE(AppendCluster(
2795 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)); 2803 GenerateSingleStreamCluster(0, 92, kAudioTrackNum, kAudioBlockDuration)));
2796 2804
2797 CheckExpectedRanges("{ [0,92) }"); 2805 CheckExpectedRanges("{ [0,92) }");
2798 2806
2799 // Append a disjoint cluster to check for two separate ranges. 2807 // Append a disjoint cluster to check for two separate ranges.
2800 AppendCluster(GenerateSingleStreamCluster( 2808 ASSERT_TRUE(AppendCluster(GenerateSingleStreamCluster(
2801 150, 219, kAudioTrackNum, kAudioBlockDuration)); 2809 150, 219, kAudioTrackNum, kAudioBlockDuration)));
2802 2810
2803 CheckExpectedRanges("{ [0,92) [150,219) }"); 2811 CheckExpectedRanges("{ [0,92) [150,219) }");
2804 } 2812 }
2805 2813
2806 // Test ranges in a video-only stream. 2814 // Test ranges in a video-only stream.
2807 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { 2815 TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) {
2808 EXPECT_CALL(*this, DemuxerOpened()); 2816 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
2809 demuxer_->Initialize(
2810 &host_, CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true);
2811
2812 ASSERT_EQ(AddId(kSourceId, HAS_VIDEO), ChunkDemuxer::kOk);
2813 ExpectInitMediaLogs(HAS_VIDEO);
2814 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
2815 AppendInitSegment(HAS_VIDEO);
2816 2817
2817 // Test a simple cluster. 2818 // Test a simple cluster.
2818 AppendCluster( 2819 ASSERT_TRUE(AppendCluster(GenerateSingleStreamCluster(0, 132, kVideoTrackNum,
2819 GenerateSingleStreamCluster(0, 132, kVideoTrackNum, kVideoBlockDuration)); 2820 kVideoBlockDuration)));
2820 2821
2821 CheckExpectedRanges("{ [0,132) }"); 2822 CheckExpectedRanges("{ [0,132) }");
2822 2823
2823 // Append a disjoint cluster to check for two separate ranges. 2824 // Append a disjoint cluster to check for two separate ranges.
2824 AppendCluster(GenerateSingleStreamCluster( 2825 ASSERT_TRUE(AppendCluster(GenerateSingleStreamCluster(
2825 200, 299, kVideoTrackNum, kVideoBlockDuration)); 2826 200, 299, kVideoTrackNum, kVideoBlockDuration)));
2826 2827
2827 CheckExpectedRanges("{ [0,132) [200,299) }"); 2828 CheckExpectedRanges("{ [0,132) [200,299) }");
2828 } 2829 }
2829 2830
2830 TEST_F(ChunkDemuxerTest, GetBufferedRanges_SeparateStreams) { 2831 TEST_F(ChunkDemuxerTest, GetBufferedRanges_SeparateStreams) {
2831 std::string audio_id = "audio1"; 2832 std::string audio_id = "audio1";
2832 std::string video_id = "video1"; 2833 std::string video_id = "video1";
2833 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 2834 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
2834 2835
2835 // Append audio and video data into separate source ids. 2836 // Append audio and video data into separate source ids.
2836 2837
2837 // Audio block: 0 -> 23 2838 // Audio block: 0 -> 23
2838 // Video block: 0 -> 33 2839 // Video block: 0 -> 33
2839 // Buffered Range: 0 -> 23 2840 // Buffered Range: 0 -> 23
2840 // Audio block duration is smaller than video block duration, 2841 // Audio block duration is smaller than video block duration,
2841 // so the buffered ranges should correspond to the audio blocks. 2842 // so the buffered ranges should correspond to the audio blocks.
2842 AppendCluster(audio_id, 2843 ASSERT_TRUE(AppendCluster(
2843 GenerateSingleStreamCluster(0, 23, kAudioTrackNum, 23)); 2844 audio_id, GenerateSingleStreamCluster(0, 23, kAudioTrackNum, 23)));
2844 AppendCluster(video_id, 2845 ASSERT_TRUE(AppendCluster(
2845 GenerateSingleStreamCluster(0, 33, kVideoTrackNum, 33)); 2846 video_id, GenerateSingleStreamCluster(0, 33, kVideoTrackNum, 33)));
2846 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }"); 2847 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }");
2847 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }"); 2848 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }");
2848 CheckExpectedRangesForMediaSource("{ [0,23) }"); 2849 CheckExpectedRangesForMediaSource("{ [0,23) }");
2849 2850
2850 // Audio blocks: 300 -> 400 2851 // Audio blocks: 300 -> 400
2851 // Video blocks: 320 -> 420 2852 // Video blocks: 320 -> 420
2852 // Buffered Range: 320 -> 400 (jagged start and end across SourceBuffers) 2853 // Buffered Range: 320 -> 400 (jagged start and end across SourceBuffers)
2853 AppendCluster(audio_id, 2854 ASSERT_TRUE(AppendCluster(
2854 GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50)); 2855 audio_id, GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50)));
2855 AppendCluster(video_id, 2856 ASSERT_TRUE(AppendCluster(
2856 GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50)); 2857 video_id, GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50)));
2857 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }"); 2858 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }");
2858 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) }"); 2859 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) }");
2859 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) }"); 2860 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) }");
2860 2861
2861 // Audio block: 520 -> 590 2862 // Audio block: 520 -> 590
2862 // Video block: 500 -> 570 2863 // Video block: 500 -> 570
2863 // Buffered Range: 520 -> 570 (jagged start and end across SourceBuffers) 2864 // Buffered Range: 520 -> 570 (jagged start and end across SourceBuffers)
2864 AppendCluster(audio_id, 2865 ASSERT_TRUE(AppendCluster(
2865 GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70)); 2866 audio_id, GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70)));
2866 AppendCluster(video_id, 2867 ASSERT_TRUE(AppendCluster(
2867 GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70)); 2868 video_id, GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70)));
2868 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [520,590) }"); 2869 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [520,590) }");
2869 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) [500,570) }"); 2870 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) [500,570) }");
2870 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) }"); 2871 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) }");
2871 2872
2872 // Audio block: 720 -> 750 2873 // Audio block: 720 -> 750
2873 // Video block: 700 -> 770 2874 // Video block: 700 -> 770
2874 // Buffered Range: 720 -> 750 (complete overlap of audio) 2875 // Buffered Range: 720 -> 750 (complete overlap of audio)
2875 AppendCluster(audio_id, 2876 ASSERT_TRUE(AppendCluster(
2876 GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30)); 2877 audio_id, GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30)));
2877 AppendCluster(video_id, 2878 ASSERT_TRUE(AppendCluster(
2878 GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70)); 2879 video_id, GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70)));
2879 CheckExpectedRanges(DemuxerStream::AUDIO, 2880 CheckExpectedRanges(DemuxerStream::AUDIO,
2880 "{ [0,23) [300,400) [520,590) [720,750) }"); 2881 "{ [0,23) [300,400) [520,590) [720,750) }");
2881 CheckExpectedRanges(DemuxerStream::VIDEO, 2882 CheckExpectedRanges(DemuxerStream::VIDEO,
2882 "{ [0,33) [320,420) [500,570) [700,770) }"); 2883 "{ [0,33) [320,420) [500,570) [700,770) }");
2883 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) [720,750) }"); 2884 CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) [720,750) }");
2884 2885
2885 // Audio block: 900 -> 970 2886 // Audio block: 900 -> 970
2886 // Video block: 920 -> 950 2887 // Video block: 920 -> 950
2887 // Buffered Range: 920 -> 950 (complete overlap of video) 2888 // Buffered Range: 920 -> 950 (complete overlap of video)
2888 AppendCluster(audio_id, 2889 ASSERT_TRUE(AppendCluster(
2889 GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70)); 2890 audio_id, GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70)));
2890 AppendCluster(video_id, 2891 ASSERT_TRUE(AppendCluster(
2891 GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30)); 2892 video_id, GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30)));
2892 CheckExpectedRanges(DemuxerStream::AUDIO, 2893 CheckExpectedRanges(DemuxerStream::AUDIO,
2893 "{ [0,23) [300,400) [520,590) [720,750) [900,970) }"); 2894 "{ [0,23) [300,400) [520,590) [720,750) [900,970) }");
2894 CheckExpectedRanges(DemuxerStream::VIDEO, 2895 CheckExpectedRanges(DemuxerStream::VIDEO,
2895 "{ [0,33) [320,420) [500,570) [700,770) [920,950) }"); 2896 "{ [0,33) [320,420) [500,570) [700,770) [920,950) }");
2896 CheckExpectedRangesForMediaSource( 2897 CheckExpectedRangesForMediaSource(
2897 "{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); 2898 "{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
2898 2899
2899 // Appending within buffered range should not affect buffered ranges. 2900 // Appending within buffered range should not affect buffered ranges.
2900 EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000)); 2901 EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000));
2901 AppendCluster(audio_id, 2902 ASSERT_TRUE(AppendCluster(
2902 GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20)); 2903 audio_id, GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20)));
2903 AppendCluster(video_id, 2904 ASSERT_TRUE(AppendCluster(
2904 GenerateSingleStreamCluster(930, 950, kVideoTrackNum, 20)); 2905 video_id, GenerateSingleStreamCluster(930, 950, kVideoTrackNum, 20)));
2905 CheckExpectedRanges(DemuxerStream::AUDIO, 2906 CheckExpectedRanges(DemuxerStream::AUDIO,
2906 "{ [0,23) [300,400) [520,590) [720,750) [900,970) }"); 2907 "{ [0,23) [300,400) [520,590) [720,750) [900,970) }");
2907 CheckExpectedRanges(DemuxerStream::VIDEO, 2908 CheckExpectedRanges(DemuxerStream::VIDEO,
2908 "{ [0,33) [320,420) [500,570) [700,770) [920,950) }"); 2909 "{ [0,33) [320,420) [500,570) [700,770) [920,950) }");
2909 CheckExpectedRangesForMediaSource( 2910 CheckExpectedRangesForMediaSource(
2910 "{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); 2911 "{ [0,23) [320,400) [520,570) [720,750) [920,950) }");
2911 } 2912 }
2912 2913
2913 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { 2914 TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) {
2914 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 2915 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after
3070 // end timestamp according to the spec. The last audio range gets extended 3071 // end timestamp according to the spec. The last audio range gets extended
3071 // from [200,246) to [200,398) which is why the intersection results in the 3072 // from [200,246) to [200,398) which is why the intersection results in the
3072 // middle range getting larger AND the new range appearing. 3073 // middle range getting larger AND the new range appearing.
3073 CheckExpectedRanges("{ [0,46) [200,266) [332,398) }"); 3074 CheckExpectedRanges("{ [0,46) [200,266) [332,398) }");
3074 } 3075 }
3075 3076
3076 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) { 3077 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) {
3077 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3078 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3078 3079
3079 // Create a cluster where the video timecode begins 25ms after the audio. 3080 // Create a cluster where the video timecode begins 25ms after the audio.
3080 AppendCluster(GenerateCluster(0, 25, 8)); 3081 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 25, 8)));
3081 3082
3082 Seek(base::TimeDelta::FromSeconds(0)); 3083 Seek(base::TimeDelta::FromSeconds(0));
3083 GenerateExpectedReads(0, 25, 8); 3084 GenerateExpectedReads(0, 25, 8);
3084 3085
3085 // Seek to 5 seconds. 3086 // Seek to 5 seconds.
3086 Seek(base::TimeDelta::FromSeconds(5)); 3087 Seek(base::TimeDelta::FromSeconds(5));
3087 3088
3088 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms 3089 // Generate a cluster to fulfill this seek, where audio timecode begins 25ms
3089 // after the video. 3090 // after the video.
3090 AppendCluster(GenerateCluster(5025, 5000, 8)); 3091 ASSERT_TRUE(AppendCluster(GenerateCluster(5025, 5000, 8)));
3091 GenerateExpectedReads(5025, 5000, 8); 3092 GenerateExpectedReads(5025, 5000, 8);
3092 } 3093 }
3093 3094
3094 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) { 3095 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesSeparateSources) {
3095 std::string audio_id = "audio1"; 3096 std::string audio_id = "audio1";
3096 std::string video_id = "video1"; 3097 std::string video_id = "video1";
3097 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 3098 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
3098 3099
3099 // Generate two streams where the video stream starts 5ms after the audio 3100 // Generate two streams where the video stream starts 5ms after the audio
3100 // stream and append them. 3101 // stream and append them.
3101 AppendCluster(audio_id, GenerateSingleStreamCluster( 3102 ASSERT_TRUE(AppendCluster(
3102 25, 4 * kAudioBlockDuration + 25, kAudioTrackNum, kAudioBlockDuration)); 3103 audio_id,
3103 AppendCluster(video_id, GenerateSingleStreamCluster( 3104 GenerateSingleStreamCluster(25, 4 * kAudioBlockDuration + 25,
3104 30, 4 * kVideoBlockDuration + 30, kVideoTrackNum, kVideoBlockDuration)); 3105 kAudioTrackNum, kAudioBlockDuration)));
3106 ASSERT_TRUE(AppendCluster(
3107 video_id,
3108 GenerateSingleStreamCluster(30, 4 * kVideoBlockDuration + 30,
3109 kVideoTrackNum, kVideoBlockDuration)));
3105 3110
3106 // Both streams should be able to fulfill a seek to 25. 3111 // Both streams should be able to fulfill a seek to 25.
3107 Seek(base::TimeDelta::FromMilliseconds(25)); 3112 Seek(base::TimeDelta::FromMilliseconds(25));
3108 GenerateAudioStreamExpectedReads(25, 4); 3113 GenerateAudioStreamExpectedReads(25, 4);
3109 GenerateVideoStreamExpectedReads(30, 4); 3114 GenerateVideoStreamExpectedReads(30, 4);
3110 } 3115 }
3111 3116
3112 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) { 3117 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) {
3113 std::string audio_id = "audio1"; 3118 std::string audio_id = "audio1";
3114 std::string video_id = "video1"; 3119 std::string video_id = "video1";
3115 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 3120 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
3116 3121
3117 // Generate two streams where the video stream starts 10s after the audio 3122 // Generate two streams where the video stream starts 10s after the audio
3118 // stream and append them. 3123 // stream and append them.
3119 AppendCluster(audio_id, GenerateSingleStreamCluster(0, 3124 ASSERT_TRUE(AppendCluster(
3120 4 * kAudioBlockDuration + 0, kAudioTrackNum, kAudioBlockDuration)); 3125 audio_id,
3121 AppendCluster(video_id, GenerateSingleStreamCluster(10000, 3126 GenerateSingleStreamCluster(0, 4 * kAudioBlockDuration + 0,
3122 4 * kVideoBlockDuration + 10000, kVideoTrackNum, kVideoBlockDuration)); 3127 kAudioTrackNum, kAudioBlockDuration)));
3128 ASSERT_TRUE(AppendCluster(
3129 video_id,
3130 GenerateSingleStreamCluster(10000, 4 * kVideoBlockDuration + 10000,
3131 kVideoTrackNum, kVideoBlockDuration)));
3123 3132
3124 // Should not be able to fulfill a seek to 0. 3133 // Should not be able to fulfill a seek to 0.
3125 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(0); 3134 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(0);
3126 demuxer_->StartWaitingForSeek(seek_time); 3135 demuxer_->StartWaitingForSeek(seek_time);
3127 demuxer_->Seek(seek_time, 3136 demuxer_->Seek(seek_time,
3128 NewExpectedStatusCB(PIPELINE_ERROR_ABORT)); 3137 NewExpectedStatusCB(PIPELINE_ERROR_ABORT));
3129 ExpectRead(DemuxerStream::AUDIO, 0); 3138 ExpectRead(DemuxerStream::AUDIO, 0);
3130 ExpectEndOfStream(DemuxerStream::VIDEO); 3139 ExpectEndOfStream(DemuxerStream::VIDEO);
3131 } 3140 }
3132 3141
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
3179 3188
3180 TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) { 3189 TEST_F(ChunkDemuxerTest, EndOfStreamStillSetAfterSeek) {
3181 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3190 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3182 3191
3183 EXPECT_CALL(host_, SetDuration(_)) 3192 EXPECT_CALL(host_, SetDuration(_))
3184 .Times(AnyNumber()); 3193 .Times(AnyNumber());
3185 3194
3186 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92); 3195 base::TimeDelta kLastAudioTimestamp = base::TimeDelta::FromMilliseconds(92);
3187 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99); 3196 base::TimeDelta kLastVideoTimestamp = base::TimeDelta::FromMilliseconds(99);
3188 3197
3189 AppendCluster(kDefaultFirstCluster()); 3198 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
3190 AppendCluster(kDefaultSecondCluster()); 3199 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
3191 MarkEndOfStream(PIPELINE_OK); 3200 MarkEndOfStream(PIPELINE_OK);
3192 3201
3193 DemuxerStream::Status status; 3202 DemuxerStream::Status status;
3194 base::TimeDelta last_timestamp; 3203 base::TimeDelta last_timestamp;
3195 3204
3196 // Verify that we can read audio & video to the end w/o problems. 3205 // Verify that we can read audio & video to the end w/o problems.
3197 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); 3206 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp);
3198 EXPECT_EQ(DemuxerStream::kOk, status); 3207 EXPECT_EQ(DemuxerStream::kOk, status);
3199 EXPECT_EQ(kLastAudioTimestamp, last_timestamp); 3208 EXPECT_EQ(kLastAudioTimestamp, last_timestamp);
3200 3209
(...skipping 23 matching lines...) Expand all
3224 CheckExpectedRanges("video", "{ }"); 3233 CheckExpectedRanges("video", "{ }");
3225 } 3234 }
3226 3235
3227 // Test that Seek() completes successfully when the first cluster 3236 // Test that Seek() completes successfully when the first cluster
3228 // arrives. 3237 // arrives.
3229 TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) { 3238 TEST_F(ChunkDemuxerTest, EndOfStreamDuringSeek) {
3230 InSequence s; 3239 InSequence s;
3231 3240
3232 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3241 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3233 3242
3234 AppendCluster(kDefaultFirstCluster()); 3243 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
3235 3244
3236 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0); 3245 base::TimeDelta seek_time = base::TimeDelta::FromSeconds(0);
3237 demuxer_->StartWaitingForSeek(seek_time); 3246 demuxer_->StartWaitingForSeek(seek_time);
3238 3247
3239 AppendCluster(kDefaultSecondCluster()); 3248 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
3240 EXPECT_CALL(host_, SetDuration( 3249 EXPECT_CALL(host_, SetDuration(
3241 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp))); 3250 base::TimeDelta::FromMilliseconds(kDefaultSecondClusterEndTimestamp)));
3242 MarkEndOfStream(PIPELINE_OK); 3251 MarkEndOfStream(PIPELINE_OK);
3243 3252
3244 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK)); 3253 demuxer_->Seek(seek_time, NewExpectedStatusCB(PIPELINE_OK));
3245 3254
3246 GenerateExpectedReads(0, 4); 3255 GenerateExpectedReads(0, 4);
3247 GenerateExpectedReads(46, 66, 5); 3256 GenerateExpectedReads(46, 66, 5);
3248 3257
3249 EndOfStreamHelper end_of_stream_helper(demuxer_.get()); 3258 EndOfStreamHelper end_of_stream_helper(demuxer_.get());
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
3386 3395
3387 // Verify that no config change is signalled. 3396 // Verify that no config change is signalled.
3388 ExpectRead(DemuxerStream::VIDEO, 801); 3397 ExpectRead(DemuxerStream::VIDEO, 801);
3389 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); 3398 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
3390 } 3399 }
3391 3400
3392 TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) { 3401 TEST_F(ChunkDemuxerTest, TimestampPositiveOffset) {
3393 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3402 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3394 3403
3395 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30))); 3404 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(30)));
3396 AppendCluster(GenerateCluster(0, 2)); 3405 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 2)));
3397 3406
3398 Seek(base::TimeDelta::FromMilliseconds(30000)); 3407 Seek(base::TimeDelta::FromMilliseconds(30000));
3399 3408
3400 GenerateExpectedReads(30000, 2); 3409 GenerateExpectedReads(30000, 2);
3401 } 3410 }
3402 3411
3403 TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) { 3412 TEST_F(ChunkDemuxerTest, TimestampNegativeOffset) {
3404 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3413 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3405 3414
3406 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1))); 3415 ASSERT_TRUE(SetTimestampOffset(kSourceId, base::TimeDelta::FromSeconds(-1)));
3407 AppendCluster(GenerateCluster(1000, 2)); 3416 ASSERT_TRUE(AppendCluster(GenerateCluster(1000, 2)));
3408 3417
3409 GenerateExpectedReads(0, 2); 3418 GenerateExpectedReads(0, 2);
3410 } 3419 }
3411 3420
3412 TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) { 3421 TEST_F(ChunkDemuxerTest, TimestampOffsetSeparateStreams) {
3413 std::string audio_id = "audio1"; 3422 std::string audio_id = "audio1";
3414 std::string video_id = "video1"; 3423 std::string video_id = "video1";
3415 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); 3424 ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id));
3416 3425
3417 ASSERT_TRUE(SetTimestampOffset( 3426 ASSERT_TRUE(SetTimestampOffset(
3418 audio_id, base::TimeDelta::FromMilliseconds(-2500))); 3427 audio_id, base::TimeDelta::FromMilliseconds(-2500)));
3419 ASSERT_TRUE(SetTimestampOffset( 3428 ASSERT_TRUE(SetTimestampOffset(
3420 video_id, base::TimeDelta::FromMilliseconds(-2500))); 3429 video_id, base::TimeDelta::FromMilliseconds(-2500)));
3421 AppendCluster(audio_id, GenerateSingleStreamCluster(2500, 3430 ASSERT_TRUE(AppendCluster(
3422 2500 + kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); 3431 audio_id,
3423 AppendCluster(video_id, GenerateSingleStreamCluster(2500, 3432 GenerateSingleStreamCluster(2500, 2500 + kAudioBlockDuration * 4,
3424 2500 + kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); 3433 kAudioTrackNum, kAudioBlockDuration)));
3434 ASSERT_TRUE(AppendCluster(
3435 video_id,
3436 GenerateSingleStreamCluster(2500, 2500 + kVideoBlockDuration * 4,
3437 kVideoTrackNum, kVideoBlockDuration)));
3425 GenerateAudioStreamExpectedReads(0, 4); 3438 GenerateAudioStreamExpectedReads(0, 4);
3426 GenerateVideoStreamExpectedReads(0, 4); 3439 GenerateVideoStreamExpectedReads(0, 4);
3427 3440
3428 Seek(base::TimeDelta::FromMilliseconds(27300)); 3441 Seek(base::TimeDelta::FromMilliseconds(27300));
3429 3442
3430 ASSERT_TRUE(SetTimestampOffset( 3443 ASSERT_TRUE(SetTimestampOffset(
3431 audio_id, base::TimeDelta::FromMilliseconds(27300))); 3444 audio_id, base::TimeDelta::FromMilliseconds(27300)));
3432 ASSERT_TRUE(SetTimestampOffset( 3445 ASSERT_TRUE(SetTimestampOffset(
3433 video_id, base::TimeDelta::FromMilliseconds(27300))); 3446 video_id, base::TimeDelta::FromMilliseconds(27300)));
3434 AppendCluster(audio_id, GenerateSingleStreamCluster( 3447 ASSERT_TRUE(AppendCluster(
3435 0, kAudioBlockDuration * 4, kAudioTrackNum, kAudioBlockDuration)); 3448 audio_id,
3436 AppendCluster(video_id, GenerateSingleStreamCluster( 3449 GenerateSingleStreamCluster(0, kAudioBlockDuration * 4, kAudioTrackNum,
3437 0, kVideoBlockDuration * 4, kVideoTrackNum, kVideoBlockDuration)); 3450 kAudioBlockDuration)));
3451 ASSERT_TRUE(AppendCluster(
3452 video_id,
3453 GenerateSingleStreamCluster(0, kVideoBlockDuration * 4, kVideoTrackNum,
3454 kVideoBlockDuration)));
3438 GenerateVideoStreamExpectedReads(27300, 4); 3455 GenerateVideoStreamExpectedReads(27300, 4);
3439 GenerateAudioStreamExpectedReads(27300, 4); 3456 GenerateAudioStreamExpectedReads(27300, 4);
3440 } 3457 }
3441 3458
3442 TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) { 3459 TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) {
3443 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3460 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3444 3461
3445 std::unique_ptr<Cluster> cluster = GenerateCluster(0, 2); 3462 std::unique_ptr<Cluster> cluster = GenerateCluster(0, 2);
3446 // Append only part of the cluster data. 3463 // Append only part of the cluster data.
3447 AppendData(cluster->data(), cluster->size() - 13); 3464 ASSERT_TRUE(AppendData(cluster->data(), cluster->size() - 13));
3448 3465
3449 // Confirm we're in the middle of parsing a media segment. 3466 // Confirm we're in the middle of parsing a media segment.
3450 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); 3467 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
3451 3468
3452 demuxer_->ResetParserState(kSourceId, 3469 demuxer_->ResetParserState(kSourceId,
3453 append_window_start_for_next_append_, 3470 append_window_start_for_next_append_,
3454 append_window_end_for_next_append_, 3471 append_window_end_for_next_append_,
3455 &timestamp_offset_map_[kSourceId]); 3472 &timestamp_offset_map_[kSourceId]);
3456 3473
3457 // After ResetParserState(), parsing should no longer be in the middle of a 3474 // After ResetParserState(), parsing should no longer be in the middle of a
(...skipping 22 matching lines...) Expand all
3480 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000] 3497 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000]
3481 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767] 3498 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767]
3482 // Video: last PES: 3499 // Video: last PES:
3483 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128] 3500 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128]
3484 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794] 3501 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794]
3485 // Audio: last PES: 3502 // Audio: last PES:
3486 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309] 3503 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309]
3487 3504
3488 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts"); 3505 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
3489 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 3506 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
3490 AppendData(kSourceId, buffer->data(), buffer->data_size()); 3507 ASSERT_TRUE(AppendData(kSourceId, buffer->data(), buffer->data_size()));
3491 3508
3492 // Confirm we're in the middle of parsing a media segment. 3509 // Confirm we're in the middle of parsing a media segment.
3493 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); 3510 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
3494 3511
3495 // ResetParserState on the Mpeg2 TS parser triggers the emission of the last 3512 // ResetParserState on the Mpeg2 TS parser triggers the emission of the last
3496 // video buffer which is pending in the stream parser. 3513 // video buffer which is pending in the stream parser.
3497 Ranges<base::TimeDelta> range_before_abort = 3514 Ranges<base::TimeDelta> range_before_abort =
3498 demuxer_->GetBufferedRanges(kSourceId); 3515 demuxer_->GetBufferedRanges(kSourceId);
3499 demuxer_->ResetParserState(kSourceId, 3516 demuxer_->ResetParserState(kSourceId,
3500 append_window_start_for_next_append_, 3517 append_window_start_for_next_append_,
(...skipping 27 matching lines...) Expand all
3528 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000] 3545 // PTS: 126000 (0x0001ec30) [= 90 kHz-Timestamp: 0:00:01.4000]
3529 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767] 3546 // DTS: 123910 (0x0001e406) [= 90 kHz-Timestamp: 0:00:01.3767]
3530 // Video: last PES: 3547 // Video: last PES:
3531 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128] 3548 // PTS: 370155 (0x0005a5eb) [= 90 kHz-Timestamp: 0:00:04.1128]
3532 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794] 3549 // DTS: 367152 (0x00059a30) [= 90 kHz-Timestamp: 0:00:04.0794]
3533 // Audio: last PES: 3550 // Audio: last PES:
3534 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309] 3551 // PTS: 353788 (0x000565fc) [= 90 kHz-Timestamp: 0:00:03.9309]
3535 3552
3536 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts"); 3553 scoped_refptr<DecoderBuffer> buffer = ReadTestDataFile("bear-1280x720.ts");
3537 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 3554 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
3538 AppendData(kSourceId, buffer->data(), buffer->data_size()); 3555 ASSERT_TRUE(AppendData(kSourceId, buffer->data(), buffer->data_size()));
3539 3556
3540 // Confirm we're in the middle of parsing a media segment. 3557 // Confirm we're in the middle of parsing a media segment.
3541 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId)); 3558 ASSERT_TRUE(demuxer_->IsParsingMediaSegment(kSourceId));
3542 3559
3543 // Seek to a time corresponding to buffers that will be emitted during the 3560 // Seek to a time corresponding to buffers that will be emitted during the
3544 // abort. 3561 // abort.
3545 Seek(base::TimeDelta::FromMilliseconds(4110)); 3562 Seek(base::TimeDelta::FromMilliseconds(4110));
3546 3563
3547 // ResetParserState on the Mpeg2 TS parser triggers the emission of the last 3564 // ResetParserState on the Mpeg2 TS parser triggers the emission of the last
3548 // video buffer which is pending in the stream parser. 3565 // video buffer which is pending in the stream parser.
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
3621 static_assert(arraysize(kBuffer) == arraysize(kExpectedReturnValues), 3638 static_assert(arraysize(kBuffer) == arraysize(kExpectedReturnValues),
3622 "test arrays out of sync"); 3639 "test arrays out of sync");
3623 static_assert(arraysize(kBuffer) == sizeof(kBuffer), 3640 static_assert(arraysize(kBuffer) == sizeof(kBuffer),
3624 "there should be one byte per index"); 3641 "there should be one byte per index");
3625 3642
3626 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 3643 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
3627 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)).Times(2); 3644 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)).Times(2);
3628 EXPECT_MEDIA_LOG(GeneratedSplice(22000, 2000)); 3645 EXPECT_MEDIA_LOG(GeneratedSplice(22000, 2000));
3629 for (size_t i = 0; i < sizeof(kBuffer); i++) { 3646 for (size_t i = 0; i < sizeof(kBuffer); i++) {
3630 DVLOG(3) << "Appending and testing index " << i; 3647 DVLOG(3) << "Appending and testing index " << i;
3631 AppendData(kBuffer + i, 1); 3648 ASSERT_TRUE(AppendData(kBuffer + i, 1));
3632 bool expected_return_value = kExpectedReturnValues[i]; 3649 bool expected_return_value = kExpectedReturnValues[i];
3633 EXPECT_EQ(expected_return_value, 3650 EXPECT_EQ(expected_return_value,
3634 demuxer_->IsParsingMediaSegment(kSourceId)); 3651 demuxer_->IsParsingMediaSegment(kSourceId));
3635 } 3652 }
3636 } 3653 }
3637 3654
3638 TEST_F(ChunkDemuxerTest, DurationChange) { 3655 TEST_F(ChunkDemuxerTest, DurationChange) {
3639 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3656 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3640 const int kStreamDuration = kDefaultDuration().InMilliseconds(); 3657 const int kStreamDuration = kDefaultDuration().InMilliseconds();
3641 3658
3642 // Add data leading up to the currently set duration. 3659 // Add data leading up to the currently set duration.
3643 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration, 3660 ASSERT_TRUE(
3644 kStreamDuration - kVideoBlockDuration, 3661 AppendCluster(GenerateCluster(kStreamDuration - kAudioBlockDuration,
3645 2)); 3662 kStreamDuration - kVideoBlockDuration, 2)));
3646 3663
3647 CheckExpectedRanges("{ [201191,201224) }"); 3664 CheckExpectedRanges("{ [201191,201224) }");
3648 3665
3649 // Add data beginning at the currently set duration and expect a new duration 3666 // Add data beginning at the currently set duration and expect a new duration
3650 // to be signaled. Note that the last video block will have a higher end 3667 // to be signaled. Note that the last video block will have a higher end
3651 // timestamp than the last audio block. 3668 // timestamp than the last audio block.
3652 const int kNewStreamDurationVideo = kStreamDuration + kVideoBlockDuration; 3669 const int kNewStreamDurationVideo = kStreamDuration + kVideoBlockDuration;
3653 EXPECT_CALL(host_, SetDuration( 3670 EXPECT_CALL(host_, SetDuration(
3654 base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo))); 3671 base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo)));
3655 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2)); 3672 ASSERT_TRUE(
3673 AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2)));
3656 3674
3657 CheckExpectedRanges("{ [201191,201247) }"); 3675 CheckExpectedRanges("{ [201191,201247) }");
3658 3676
3659 // Add more data to the end of each media type. Note that the last audio block 3677 // Add more data to the end of each media type. Note that the last audio block
3660 // will have a higher end timestamp than the last video block. 3678 // will have a higher end timestamp than the last video block.
3661 const int kFinalStreamDuration = kStreamDuration + kAudioBlockDuration * 3; 3679 const int kFinalStreamDuration = kStreamDuration + kAudioBlockDuration * 3;
3662 EXPECT_CALL(host_, SetDuration( 3680 EXPECT_CALL(host_, SetDuration(
3663 base::TimeDelta::FromMilliseconds(kFinalStreamDuration))); 3681 base::TimeDelta::FromMilliseconds(kFinalStreamDuration)));
3664 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration, 3682 ASSERT_TRUE(
3665 kStreamDuration + kVideoBlockDuration, 3683 AppendCluster(GenerateCluster(kStreamDuration + kAudioBlockDuration,
3666 3)); 3684 kStreamDuration + kVideoBlockDuration, 3)));
3667 3685
3668 // See that the range has increased appropriately (but not to the full 3686 // See that the range has increased appropriately (but not to the full
3669 // duration of 201293, since there is not enough video appended for that). 3687 // duration of 201293, since there is not enough video appended for that).
3670 CheckExpectedRanges("{ [201191,201290) }"); 3688 CheckExpectedRanges("{ [201191,201290) }");
3671 } 3689 }
3672 3690
3673 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) { 3691 TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) {
3674 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3692 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3675 ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration())); 3693 ASSERT_TRUE(SetTimestampOffset(kSourceId, kDefaultDuration()));
3676 EXPECT_CALL(host_, SetDuration( 3694 EXPECT_CALL(host_, SetDuration(
3677 kDefaultDuration() + base::TimeDelta::FromMilliseconds( 3695 kDefaultDuration() + base::TimeDelta::FromMilliseconds(
3678 kVideoBlockDuration * 2))); 3696 kVideoBlockDuration * 2)));
3679 AppendCluster(GenerateCluster(0, 4)); 3697 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 4)));
3680 } 3698 }
3681 3699
3682 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) { 3700 TEST_F(ChunkDemuxerTest, EndOfStreamTruncateDuration) {
3683 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3701 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3684 3702
3685 AppendCluster(kDefaultFirstCluster()); 3703 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
3686 3704
3687 EXPECT_CALL(host_, SetDuration( 3705 EXPECT_CALL(host_, SetDuration(
3688 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp))); 3706 base::TimeDelta::FromMilliseconds(kDefaultFirstClusterEndTimestamp)));
3689 MarkEndOfStream(PIPELINE_OK); 3707 MarkEndOfStream(PIPELINE_OK);
3690 } 3708 }
3691 3709
3692 3710
3693 TEST_F(ChunkDemuxerTest, ZeroLengthAppend) { 3711 TEST_F(ChunkDemuxerTest, ZeroLengthAppend) {
3694 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3712 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3695 AppendData(NULL, 0); 3713 ASSERT_TRUE(AppendData(NULL, 0));
3696 } 3714 }
3697 3715
3698 TEST_F(ChunkDemuxerTest, AppendAfterEndOfStream) { 3716 TEST_F(ChunkDemuxerTest, AppendAfterEndOfStream) {
3699 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3717 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3700 3718
3701 EXPECT_CALL(host_, SetDuration(_)) 3719 EXPECT_CALL(host_, SetDuration(_))
3702 .Times(AnyNumber()); 3720 .Times(AnyNumber());
3703 3721
3704 AppendCluster(kDefaultFirstCluster()); 3722 ASSERT_TRUE(AppendCluster(kDefaultFirstCluster()));
3705 MarkEndOfStream(PIPELINE_OK); 3723 MarkEndOfStream(PIPELINE_OK);
3706 3724
3707 demuxer_->UnmarkEndOfStream(); 3725 demuxer_->UnmarkEndOfStream();
3708 3726
3709 AppendCluster(kDefaultSecondCluster()); 3727 ASSERT_TRUE(AppendCluster(kDefaultSecondCluster()));
3710 MarkEndOfStream(PIPELINE_OK); 3728 MarkEndOfStream(PIPELINE_OK);
3711 } 3729 }
3712 3730
3713 // Test receiving a Shutdown() call before we get an Initialize() 3731 // Test receiving a Shutdown() call before we get an Initialize()
3714 // call. This can happen if video element gets destroyed before 3732 // call. This can happen if video element gets destroyed before
3715 // the pipeline has a chance to initialize the demuxer. 3733 // the pipeline has a chance to initialize the demuxer.
3716 TEST_F(ChunkDemuxerTest, Shutdown_BeforeInitialize) { 3734 TEST_F(ChunkDemuxerTest, Shutdown_BeforeInitialize) {
3717 demuxer_->Shutdown(); 3735 demuxer_->Shutdown();
3718 demuxer_->Initialize( 3736 demuxer_->Initialize(
3719 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true); 3737 &host_, CreateInitDoneCB(DEMUXER_ERROR_COULD_NOT_OPEN), true);
3720 message_loop_.RunUntilIdle(); 3738 message_loop_.RunUntilIdle();
3721 } 3739 }
3722 3740
3723 // Verifies that signaling end of stream while stalled at a gap 3741 // Verifies that signaling end of stream while stalled at a gap
3724 // boundary does not trigger end of stream buffers to be returned. 3742 // boundary does not trigger end of stream buffers to be returned.
3725 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { 3743 TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) {
3726 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3744 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3727 3745
3728 AppendCluster(0, 10); 3746 ASSERT_TRUE(AppendCluster(0, 10));
3729 AppendCluster(300, 10); 3747 ASSERT_TRUE(AppendCluster(300, 10));
3730 CheckExpectedRanges("{ [0,132) [300,432) }"); 3748 CheckExpectedRanges("{ [0,132) [300,432) }");
3731 3749
3732 GenerateExpectedReads(0, 10); 3750 GenerateExpectedReads(0, 10);
3733 3751
3734 bool audio_read_done = false; 3752 bool audio_read_done = false;
3735 bool video_read_done = false; 3753 bool video_read_done = false;
3736 ReadAudio(base::Bind(&OnReadDone, 3754 ReadAudio(base::Bind(&OnReadDone,
3737 base::TimeDelta::FromMilliseconds(138), 3755 base::TimeDelta::FromMilliseconds(138),
3738 &audio_read_done)); 3756 &audio_read_done));
3739 ReadVideo(base::Bind(&OnReadDone, 3757 ReadVideo(base::Bind(&OnReadDone,
3740 base::TimeDelta::FromMilliseconds(138), 3758 base::TimeDelta::FromMilliseconds(138),
3741 &video_read_done)); 3759 &video_read_done));
3742 3760
3743 // Verify that the reads didn't complete 3761 // Verify that the reads didn't complete
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 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(438))); 3765 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(438)));
3748 MarkEndOfStream(PIPELINE_OK); 3766 MarkEndOfStream(PIPELINE_OK);
3749 3767
3750 // Verify that the reads still haven't completed. 3768 // Verify that the reads still haven't completed.
3751 EXPECT_FALSE(audio_read_done); 3769 EXPECT_FALSE(audio_read_done);
3752 EXPECT_FALSE(video_read_done); 3770 EXPECT_FALSE(video_read_done);
3753 3771
3754 demuxer_->UnmarkEndOfStream(); 3772 demuxer_->UnmarkEndOfStream();
3755 3773
3756 AppendCluster(138, 22); 3774 ASSERT_TRUE(AppendCluster(138, 22));
3757 3775
3758 message_loop_.RunUntilIdle(); 3776 message_loop_.RunUntilIdle();
3759 3777
3760 CheckExpectedRanges("{ [0,435) }"); 3778 CheckExpectedRanges("{ [0,435) }");
3761 3779
3762 // Verify that the reads have completed. 3780 // Verify that the reads have completed.
3763 EXPECT_TRUE(audio_read_done); 3781 EXPECT_TRUE(audio_read_done);
3764 EXPECT_TRUE(video_read_done); 3782 EXPECT_TRUE(video_read_done);
3765 3783
3766 // Read the rest of the buffers. 3784 // Read the rest of the buffers.
(...skipping 22 matching lines...) Expand all
3789 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3807 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3790 3808
3791 // Cancel preroll. 3809 // Cancel preroll.
3792 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200); 3810 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(200);
3793 demuxer_->CancelPendingSeek(seek_time); 3811 demuxer_->CancelPendingSeek(seek_time);
3794 3812
3795 // Initiate the seek to the new location. 3813 // Initiate the seek to the new location.
3796 Seek(seek_time); 3814 Seek(seek_time);
3797 3815
3798 // Append data to satisfy the seek. 3816 // Append data to satisfy the seek.
3799 AppendCluster(seek_time.InMilliseconds(), 10); 3817 ASSERT_TRUE(AppendCluster(seek_time.InMilliseconds(), 10));
3800 } 3818 }
3801 3819
3802 TEST_F(ChunkDemuxerTest, SetMemoryLimitType) { 3820 TEST_F(ChunkDemuxerTest, SetMemoryLimitType) {
3803 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 3821 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
3804 3822
3805 // Set different memory limits for audio and video. 3823 // Set different memory limits for audio and video.
3806 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize); 3824 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize);
3807 demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 5 * kBlockSize + 1); 3825 demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 5 * kBlockSize + 1);
3808 3826
3809 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(1000); 3827 base::TimeDelta seek_time = base::TimeDelta::FromMilliseconds(1000);
(...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after
4140 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(150); 4158 append_window_end_for_next_append_ = base::TimeDelta::FromMilliseconds(150);
4141 4159
4142 // Read a WebM file into memory and send the data to the demuxer. The chunk 4160 // Read a WebM file into memory and send the data to the demuxer. The chunk
4143 // size has been chosen carefully to ensure the preroll buffer used by the 4161 // size has been chosen carefully to ensure the preroll buffer used by the
4144 // partial append window trim must come from a previous Append() call. 4162 // partial append window trim must come from a previous Append() call.
4145 scoped_refptr<DecoderBuffer> buffer = 4163 scoped_refptr<DecoderBuffer> buffer =
4146 ReadTestDataFile("bear-320x240-audio-only.webm"); 4164 ReadTestDataFile("bear-320x240-audio-only.webm");
4147 ExpectInitMediaLogs(HAS_AUDIO); 4165 ExpectInitMediaLogs(HAS_AUDIO);
4148 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4166 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4149 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)); 4167 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
4150 AppendDataInPieces(buffer->data(), buffer->data_size(), 128); 4168 ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 128));
4151 4169
4152 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4170 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
4153 CheckExpectedBuffers(stream, "50KP 50K 62K 86K 109K 122K 125K 128K"); 4171 CheckExpectedBuffers(stream, "50KP 50K 62K 86K 109K 122K 125K 128K");
4154 } 4172 }
4155 4173
4156 TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { 4174 TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) {
4157 EXPECT_CALL(*this, DemuxerOpened()); 4175 EXPECT_CALL(*this, DemuxerOpened());
4158 demuxer_->Initialize( 4176 demuxer_->Initialize(
4159 &host_, 4177 &host_,
4160 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK), 4178 CreateInitDoneCB(base::TimeDelta::FromMilliseconds(2744), PIPELINE_OK),
4161 true); 4179 true);
4162 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO)); 4180 ASSERT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, HAS_AUDIO));
4163 4181
4164 // Set the append window such that the first file is completely before the 4182 // Set the append window such that the first file is completely before the
4165 // append window. 4183 // append window.
4166 // Expect duration adjustment since actual duration differs slightly from 4184 // Expect duration adjustment since actual duration differs slightly from
4167 // duration in the init segment. 4185 // duration in the init segment.
4168 const base::TimeDelta duration_1 = base::TimeDelta::FromMilliseconds(2746); 4186 const base::TimeDelta duration_1 = base::TimeDelta::FromMilliseconds(2746);
4169 append_window_start_for_next_append_ = duration_1; 4187 append_window_start_for_next_append_ = duration_1;
4170 4188
4171 // Read a WebM file into memory and append the data. 4189 // Read a WebM file into memory and append the data.
4172 scoped_refptr<DecoderBuffer> buffer = 4190 scoped_refptr<DecoderBuffer> buffer =
4173 ReadTestDataFile("bear-320x240-audio-only.webm"); 4191 ReadTestDataFile("bear-320x240-audio-only.webm");
4174 ExpectInitMediaLogs(HAS_AUDIO); 4192 ExpectInitMediaLogs(HAS_AUDIO);
4175 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4193 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4176 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)); 4194 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2));
4177 AppendDataInPieces(buffer->data(), buffer->data_size(), 512); 4195 ASSERT_TRUE(AppendDataInPieces(buffer->data(), buffer->data_size(), 512));
4178 CheckExpectedRanges("{ }"); 4196 CheckExpectedRanges("{ }");
4179 4197
4180 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4198 DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO);
4181 AudioDecoderConfig config_1 = stream->audio_decoder_config(); 4199 AudioDecoderConfig config_1 = stream->audio_decoder_config();
4182 4200
4183 // Read a second WebM with a different config in and append the data. 4201 // Read a second WebM with a different config in and append the data.
4184 scoped_refptr<DecoderBuffer> buffer2 = 4202 scoped_refptr<DecoderBuffer> buffer2 =
4185 ReadTestDataFile("bear-320x240-audio-only-48khz.webm"); 4203 ReadTestDataFile("bear-320x240-audio-only-48khz.webm");
4186 EXPECT_CALL(*this, InitSegmentReceivedMock(_)); 4204 EXPECT_CALL(*this, InitSegmentReceivedMock(_));
4187 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(21)); 4205 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(21));
4188 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber()); 4206 EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber());
4189 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1)); 4207 ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1));
4190 AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512); 4208 ASSERT_TRUE(AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512));
4191 CheckExpectedRanges("{ [2746,5519) }"); 4209 CheckExpectedRanges("{ [2746,5519) }");
4192 4210
4193 Seek(duration_1); 4211 Seek(duration_1);
4194 ExpectConfigChanged(DemuxerStream::AUDIO); 4212 ExpectConfigChanged(DemuxerStream::AUDIO);
4195 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config())); 4213 ASSERT_FALSE(config_1.Matches(stream->audio_decoder_config()));
4196 CheckExpectedBuffers(stream, "2746K 2767K 2789K 2810K"); 4214 CheckExpectedBuffers(stream, "2746K 2767K 2789K 2810K");
4197 } 4215 }
4198 4216
4199 TEST_F(ChunkDemuxerTest, AppendWindow_Text) { 4217 TEST_F(ChunkDemuxerTest, AppendWindow_Text) {
4200 DemuxerStream* text_stream = NULL; 4218 DemuxerStream* text_stream = NULL;
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
4367 CheckExpectedBuffers(text_stream, "275K 325K"); 4385 CheckExpectedBuffers(text_stream, "275K 325K");
4368 4386
4369 // Verify that audio & video streams continue to return expected values. 4387 // Verify that audio & video streams continue to return expected values.
4370 CheckExpectedBuffers(audio_stream, "160K 180K"); 4388 CheckExpectedBuffers(audio_stream, "160K 180K");
4371 CheckExpectedBuffers(video_stream, "180 210"); 4389 CheckExpectedBuffers(video_stream, "180 210");
4372 } 4390 }
4373 4391
4374 TEST_F(ChunkDemuxerTest, ClusterWithUnknownSize) { 4392 TEST_F(ChunkDemuxerTest, ClusterWithUnknownSize) {
4375 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4393 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4376 4394
4377 AppendCluster(GenerateCluster(0, 0, 4, true)); 4395 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 0, 4, true)));
4378 CheckExpectedRanges("{ [0,46) }"); 4396 CheckExpectedRanges("{ [0,46) }");
4379 4397
4380 // A new cluster indicates end of the previous cluster with unknown size. 4398 // A new cluster indicates end of the previous cluster with unknown size.
4381 AppendCluster(GenerateCluster(46, 66, 5, true)); 4399 ASSERT_TRUE(AppendCluster(GenerateCluster(46, 66, 5, true)));
4382 CheckExpectedRanges("{ [0,115) }"); 4400 CheckExpectedRanges("{ [0,115) }");
4383 } 4401 }
4384 4402
4385 TEST_F(ChunkDemuxerTest, CuesBetweenClustersWithUnknownSize) { 4403 TEST_F(ChunkDemuxerTest, CuesBetweenClustersWithUnknownSize) {
4386 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4404 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4387 4405
4388 // Add two clusters separated by Cues in a single Append() call. 4406 // Add two clusters separated by Cues in a single Append() call.
4389 std::unique_ptr<Cluster> cluster = GenerateCluster(0, 0, 4, true); 4407 std::unique_ptr<Cluster> cluster = GenerateCluster(0, 0, 4, true);
4390 std::vector<uint8_t> data(cluster->data(), cluster->data() + cluster->size()); 4408 std::vector<uint8_t> data(cluster->data(), cluster->data() + cluster->size());
4391 data.insert(data.end(), kCuesHeader, kCuesHeader + sizeof(kCuesHeader)); 4409 data.insert(data.end(), kCuesHeader, kCuesHeader + sizeof(kCuesHeader));
4392 cluster = GenerateCluster(46, 66, 5, true); 4410 cluster = GenerateCluster(46, 66, 5, true);
4393 data.insert(data.end(), cluster->data(), cluster->data() + cluster->size()); 4411 data.insert(data.end(), cluster->data(), cluster->data() + cluster->size());
4394 AppendData(&*data.begin(), data.size()); 4412 ASSERT_TRUE(AppendData(&*data.begin(), data.size()));
4395 4413
4396 CheckExpectedRanges("{ [0,115) }"); 4414 CheckExpectedRanges("{ [0,115) }");
4397 } 4415 }
4398 4416
4399 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { 4417 TEST_F(ChunkDemuxerTest, CuesBetweenClusters) {
4400 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4418 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4401 4419
4402 AppendCluster(GenerateCluster(0, 0, 4)); 4420 ASSERT_TRUE(AppendCluster(GenerateCluster(0, 0, 4)));
4403 AppendData(kCuesHeader, sizeof(kCuesHeader)); 4421 ASSERT_TRUE(AppendData(kCuesHeader, sizeof(kCuesHeader)));
4404 AppendCluster(GenerateCluster(46, 66, 5)); 4422 ASSERT_TRUE(AppendCluster(GenerateCluster(46, 66, 5)));
4405 CheckExpectedRanges("{ [0,115) }"); 4423 CheckExpectedRanges("{ [0,115) }");
4406 } 4424 }
4407 4425
4408 TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) { 4426 TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) {
4409 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4427 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4410 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize); 4428 demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize);
4411 demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 15 * kBlockSize); 4429 demuxer_->SetMemoryLimits(DemuxerStream::VIDEO, 15 * kBlockSize);
4412 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); 4430 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
4413 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4431 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4414 4432
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
4451 // 80 - 10 + 28 = 98). 4469 // 80 - 10 + 28 = 98).
4452 // For video stream 150 + 52 = 202. Video limit is 150 bytes. We need to 4470 // For video stream 150 + 52 = 202. Video limit is 150 bytes. We need to
4453 // remove at least 6 blocks to stay under limit. 4471 // remove at least 6 blocks to stay under limit.
4454 CheckExpectedBuffers(audio_stream, "40K 80K 120K 160K 200K 240K 280K"); 4472 CheckExpectedBuffers(audio_stream, "40K 80K 120K 160K 200K 240K 280K");
4455 CheckExpectedBuffers(video_stream, "60K 70 80K 90 100K 110 120K 130 140K"); 4473 CheckExpectedBuffers(video_stream, "60K 70 80K 90 100K 110 120K 130 140K");
4456 } 4474 }
4457 4475
4458 TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioOnly) { 4476 TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioOnly) {
4459 ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); 4477 ASSERT_TRUE(InitDemuxer(HAS_AUDIO));
4460 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio")); 4478 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio"));
4461 AppendCluster(GenerateEmptyCluster(0)); 4479 ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
4462 } 4480 }
4463 4481
4464 TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_VideoOnly) { 4482 TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_VideoOnly) {
4465 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4483 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4466 EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); 4484 EXPECT_MEDIA_LOG(SegmentMissingFrames("video"));
4467 AppendCluster(GenerateEmptyCluster(0)); 4485 ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
4468 } 4486 }
4469 4487
4470 TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioVideo) { 4488 TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioVideo) {
4471 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4489 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4472 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio")); 4490 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio"));
4473 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 10); 4491 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 10);
4474 } 4492 }
4475 4493
4476 TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_AudioVideo) { 4494 TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_AudioVideo) {
4477 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4495 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4478 EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); 4496 EXPECT_MEDIA_LOG(SegmentMissingFrames("video"));
4479 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10); 4497 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
4480 } 4498 }
4481 4499
4482 TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) { 4500 TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) {
4483 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4501 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4484 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video")); 4502 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video"));
4485 AppendCluster(GenerateEmptyCluster(0)); 4503 ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0)));
4486 } 4504 }
4487 4505
4488 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_FirstSegmentMissingKeyframe) { 4506 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_FirstSegmentMissingKeyframe) {
4489 // Append V:[n n n][n n K] 4507 // Append V:[n n n][n n K]
4490 // Expect V: [K] 4508 // Expect V: [K]
4491 ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); 4509 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4492 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); 4510 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4493 4511
4494 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2); 4512 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2);
4495 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0 10 20"); 4513 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0 10 20");
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
4668 found = true; 4686 found = true;
4669 break; 4687 break;
4670 } 4688 }
4671 video_start++; 4689 video_start++;
4672 } 4690 }
4673 4691
4674 ASSERT_TRUE(found); 4692 ASSERT_TRUE(found);
4675 ASSERT_GT(video_start, 0); 4693 ASSERT_GT(video_start, 0);
4676 ASSERT_LT(video_start, cluster->size() - 3); 4694 ASSERT_LT(video_start, cluster->size() - 3);
4677 4695
4678 AppendData(kSourceId, cluster->data(), video_start); 4696 ASSERT_TRUE(AppendData(kSourceId, cluster->data(), video_start));
4679 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,30) }"); 4697 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,30) }");
4680 CheckExpectedRanges(DemuxerStream::VIDEO, "{ }"); 4698 CheckExpectedRanges(DemuxerStream::VIDEO, "{ }");
4681 4699
4682 demuxer_->Remove(kSourceId, base::TimeDelta(), 4700 demuxer_->Remove(kSourceId, base::TimeDelta(),
4683 base::TimeDelta::FromMilliseconds(30)); 4701 base::TimeDelta::FromMilliseconds(30));
4684 4702
4685 // Append the remainder of the cluster 4703 // Append the remainder of the cluster
4686 AppendData(kSourceId, cluster->data() + video_start, 4704 ASSERT_TRUE(AppendData(kSourceId, cluster->data() + video_start,
4687 cluster->size() - video_start); 4705 cluster->size() - video_start));
4688 4706
4689 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }"); 4707 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }");
4690 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,91) }"); 4708 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,91) }");
4691 CheckExpectedRanges("{ [30,90) }"); 4709 CheckExpectedRanges("{ [30,90) }");
4692 CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K"); 4710 CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K");
4693 CheckExpectedBuffers(video_stream, "71K 81"); 4711 CheckExpectedBuffers(video_stream, "71K 81");
4694 } 4712 }
4695 4713
4696 } // namespace media 4714 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/test/pipeline_integration_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698