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