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