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