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