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 <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/strings/string_number_conversions.h" | 9 #include "base/strings/string_number_conversions.h" |
10 #include "base/strings/string_split.h" | 10 #include "base/strings/string_split.h" |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
158 : append_window_end_for_next_append_(kInfiniteDuration()) { | 158 : append_window_end_for_next_append_(kInfiniteDuration()) { |
159 CreateNewDemuxer(); | 159 CreateNewDemuxer(); |
160 } | 160 } |
161 | 161 |
162 void CreateNewDemuxer() { | 162 void CreateNewDemuxer() { |
163 base::Closure open_cb = | 163 base::Closure open_cb = |
164 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); | 164 base::Bind(&ChunkDemuxerTest::DemuxerOpened, base::Unretained(this)); |
165 Demuxer::NeedKeyCB need_key_cb = | 165 Demuxer::NeedKeyCB need_key_cb = |
166 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); | 166 base::Bind(&ChunkDemuxerTest::DemuxerNeedKey, base::Unretained(this)); |
167 demuxer_.reset( | 167 demuxer_.reset( |
168 new ChunkDemuxer(open_cb, need_key_cb, base::Bind(&LogFunc), false)); | 168 new ChunkDemuxer(open_cb, need_key_cb, base::Bind(&LogFunc), true)); |
169 } | 169 } |
170 | 170 |
171 virtual ~ChunkDemuxerTest() { | 171 virtual ~ChunkDemuxerTest() { |
172 ShutdownDemuxer(); | 172 ShutdownDemuxer(); |
173 } | 173 } |
174 | 174 |
175 void CreateInitSegment(int stream_flags, | 175 void CreateInitSegment(int stream_flags, |
176 bool is_audio_encrypted, bool is_video_encrypted, | 176 bool is_audio_encrypted, bool is_video_encrypted, |
177 scoped_ptr<uint8[]>* buffer, | 177 scoped_ptr<uint8[]>* buffer, |
178 int* size) { | 178 int* size) { |
(...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
562 PIPELINE_OK), true); | 562 PIPELINE_OK), true); |
563 | 563 |
564 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk) | 564 if (AddId(kSourceId, HAS_AUDIO | HAS_VIDEO) != ChunkDemuxer::kOk) |
565 return false; | 565 return false; |
566 | 566 |
567 // Append the whole bear1 file. | 567 // Append the whole bear1 file. |
568 // TODO(wolenetz/acolwell): Remove this extra SetDuration expectation once | 568 // TODO(wolenetz/acolwell): Remove this extra SetDuration expectation once |
569 // the files are fixed to have the correct duration in their init segments, | 569 // the files are fixed to have the correct duration in their init segments, |
570 // and the CreateInitDoneCB() call, above, is fixed to used that duration. | 570 // and the CreateInitDoneCB() call, above, is fixed to used that duration. |
571 // See http://crbug.com/354284. | 571 // See http://crbug.com/354284. |
572 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2768))); | 572 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746))); |
573 AppendData(bear1->data(), bear1->data_size()); | 573 AppendData(bear1->data(), bear1->data_size()); |
574 // Last audio frame has timestamp 2721 and duration 24 (estimated from max | 574 // Last audio frame has timestamp 2721 and duration 24 (estimated from max |
575 // seen so far for audio track). | 575 // seen so far for audio track). |
576 // Last video frame has timestamp 2703 and duration 33 (from TrackEntry | 576 // Last video frame has timestamp 2703 and duration 33 (from TrackEntry |
577 // DefaultDuration for video track). | 577 // DefaultDuration for video track). |
578 CheckExpectedRanges(kSourceId, "{ [0,2736) }"); | 578 CheckExpectedRanges(kSourceId, "{ [0,2736) }"); |
579 | 579 |
580 // Append initialization segment for bear2. | 580 // Append initialization segment for bear2. |
581 // Note: Offsets here and below are derived from | 581 // Note: Offsets here and below are derived from |
582 // media/test/data/bear-640x360-manifest.js and | 582 // media/test/data/bear-640x360-manifest.js and |
(...skipping 1072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1655 {33, 3}, | 1655 {33, 3}, |
1656 {67, 6}, | 1656 {67, 6}, |
1657 {100, 9}, | 1657 {100, 9}, |
1658 {133, 12}, | 1658 {133, 12}, |
1659 {kSkip, kSkip}, | 1659 {kSkip, kSkip}, |
1660 }; | 1660 }; |
1661 | 1661 |
1662 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the | 1662 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the |
1663 // ParseWebMFile() call's expected duration, below, once the file is fixed to | 1663 // ParseWebMFile() call's expected duration, below, once the file is fixed to |
1664 // have the correct duration in the init segment. See http://crbug.com/354284. | 1664 // have the correct duration in the init segment. See http://crbug.com/354284. |
1665 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2768))); | 1665 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746))); |
1666 | 1666 |
1667 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps, | 1667 ASSERT_TRUE(ParseWebMFile("bear-320x240.webm", buffer_timestamps, |
1668 base::TimeDelta::FromMilliseconds(2744))); | 1668 base::TimeDelta::FromMilliseconds(2744))); |
1669 } | 1669 } |
1670 | 1670 |
1671 TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) { | 1671 TEST_F(ChunkDemuxerTest, WebMFile_LiveAudioAndVideo) { |
1672 struct BufferTimestamps buffer_timestamps[] = { | 1672 struct BufferTimestamps buffer_timestamps[] = { |
1673 {0, 0}, | 1673 {0, 0}, |
1674 {33, 3}, | 1674 {33, 3}, |
1675 {67, 6}, | 1675 {67, 6}, |
(...skipping 12 matching lines...) Expand all Loading... | |
1688 {kSkip, 3}, | 1688 {kSkip, 3}, |
1689 {kSkip, 6}, | 1689 {kSkip, 6}, |
1690 {kSkip, 9}, | 1690 {kSkip, 9}, |
1691 {kSkip, 12}, | 1691 {kSkip, 12}, |
1692 {kSkip, kSkip}, | 1692 {kSkip, kSkip}, |
1693 }; | 1693 }; |
1694 | 1694 |
1695 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the | 1695 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the |
1696 // ParseWebMFile() call's expected duration, below, once the file is fixed to | 1696 // ParseWebMFile() call's expected duration, below, once the file is fixed to |
1697 // have the correct duration in the init segment. See http://crbug.com/354284. | 1697 // have the correct duration in the init segment. See http://crbug.com/354284. |
1698 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2768))); | 1698 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2746))); |
1699 | 1699 |
1700 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps, | 1700 ASSERT_TRUE(ParseWebMFile("bear-320x240-audio-only.webm", buffer_timestamps, |
1701 base::TimeDelta::FromMilliseconds(2744), | 1701 base::TimeDelta::FromMilliseconds(2744), |
1702 HAS_AUDIO)); | 1702 HAS_AUDIO)); |
1703 } | 1703 } |
1704 | 1704 |
1705 TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) { | 1705 TEST_F(ChunkDemuxerTest, WebMFile_VideoOnly) { |
1706 struct BufferTimestamps buffer_timestamps[] = { | 1706 struct BufferTimestamps buffer_timestamps[] = { |
1707 {0, kSkip}, | 1707 {0, kSkip}, |
1708 {33, kSkip}, | 1708 {33, kSkip}, |
(...skipping 16 matching lines...) Expand all Loading... | |
1725 TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) { | 1725 TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) { |
1726 struct BufferTimestamps buffer_timestamps[] = { | 1726 struct BufferTimestamps buffer_timestamps[] = { |
1727 {0, 0}, | 1727 {0, 0}, |
1728 {33, 3}, | 1728 {33, 3}, |
1729 {33, 6}, | 1729 {33, 6}, |
1730 {67, 9}, | 1730 {67, 9}, |
1731 {100, 12}, | 1731 {100, 12}, |
1732 {kSkip, kSkip}, | 1732 {kSkip, kSkip}, |
1733 }; | 1733 }; |
1734 | 1734 |
1735 // TODO(wolenetz/acolwell): Remove this SetDuration expectation and update the | |
1736 // ParseWebMFile() call's expected duration, below, once the file is fixed to | |
1737 // have the correct duration in the init segment. See http://crbug.com/354284. | |
1738 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(2768))); | |
1739 | |
1740 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps, | 1735 ASSERT_TRUE(ParseWebMFile("bear-320x240-altref.webm", buffer_timestamps, |
1741 base::TimeDelta::FromMilliseconds(2767))); | 1736 base::TimeDelta::FromMilliseconds(2767))); |
1742 } | 1737 } |
1743 | 1738 |
1744 // Verify that we output buffers before the entire cluster has been parsed. | 1739 // Verify that we output buffers before the entire cluster has been parsed. |
1745 TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) { | 1740 TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) { |
1746 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 1741 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
1747 AppendEmptyCluster(0); | 1742 AppendEmptyCluster(0); |
1748 | 1743 |
1749 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6)); | 1744 scoped_ptr<Cluster> cluster(GenerateCluster(0, 6)); |
(...skipping 526 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2276 CheckExpectedRanges("{ [0,66) }"); | 2271 CheckExpectedRanges("{ [0,66) }"); |
2277 | 2272 |
2278 // Verify that the range reverts to the intersection when end of stream | 2273 // Verify that the range reverts to the intersection when end of stream |
2279 // has been cancelled. | 2274 // has been cancelled. |
2280 demuxer_->UnmarkEndOfStream(); | 2275 demuxer_->UnmarkEndOfStream(); |
2281 CheckExpectedRanges("{ [0,46) }"); | 2276 CheckExpectedRanges("{ [0,46) }"); |
2282 | 2277 |
2283 // Append and remove data so that the 2 streams' end ranges do not overlap. | 2278 // Append and remove data so that the 2 streams' end ranges do not overlap. |
2284 | 2279 |
2285 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(246))); | 2280 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(246))); |
2286 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(366))); | 2281 EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(334))); |
2287 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "200K 223K"); | 2282 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "200K 223K"); |
2288 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, | 2283 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, |
2289 "200K 233 266 299 300K 333"); | 2284 "200K 233 266 299 300K 333"); |
2290 | 2285 |
2291 // At this point, the per-stream ranges are as follows: | 2286 // At this point, the per-stream ranges are as follows: |
2292 // Audio: [0,46) [200,246) | 2287 // Audio: [0,46) [200,246) |
2293 // Video: [0,66) [200,366) | 2288 // Video: [0,66) [200,366) |
wolenetz
2014/04/02 00:47:07
s/366/334
DaleCurtis
2014/04/02 21:53:43
Done.
| |
2294 CheckExpectedRanges("{ [0,46) [200,246) }"); | 2289 CheckExpectedRanges("{ [0,46) [200,246) }"); |
2295 | 2290 |
2296 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(200), | 2291 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(200), |
2297 base::TimeDelta::FromMilliseconds(300)); | 2292 base::TimeDelta::FromMilliseconds(300)); |
2298 | 2293 |
2299 // At this point, the per-stream ranges are as follows: | 2294 // At this point, the per-stream ranges are as follows: |
2300 // Audio: [0,46) | 2295 // Audio: [0,46) |
2301 // Video: [0,66) [300,366) | 2296 // Video: [0,66) [300,366) |
wolenetz
2014/04/02 00:47:07
s/366/334
DaleCurtis
2014/04/02 21:53:43
Done.
| |
2302 CheckExpectedRanges("{ [0,46) }"); | 2297 CheckExpectedRanges("{ [0,46) }"); |
2303 | 2298 |
2304 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "200K 223K"); | 2299 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "200K 223K"); |
2305 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "200K 233"); | 2300 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "200K 233"); |
2306 | 2301 |
2307 // At this point, the per-stream ranges are as follows: | 2302 // At this point, the per-stream ranges are as follows: |
2308 // Audio: [0,46) [200,246) | 2303 // Audio: [0,46) [200,246) |
2309 // Video: [0,66) [200,266) [300,366) | 2304 // Video: [0,66) [200,266) [300,366) |
wolenetz
2014/04/02 00:47:07
nit: this comment is now incorrect, since 1ms was
DaleCurtis
2014/04/02 21:53:43
Done.
wolenetz
2014/04/03 20:01:40
(For posterity/clarification, I meant "since last
| |
2310 // NOTE: The last range on each stream do not overlap in time. | 2305 // NOTE: The last range on each stream do not overlap in time. |
2311 CheckExpectedRanges("{ [0,46) [200,246) }"); | 2306 CheckExpectedRanges("{ [0,46) [200,234) }"); |
2312 | 2307 |
2313 MarkEndOfStream(PIPELINE_OK); | 2308 MarkEndOfStream(PIPELINE_OK); |
2314 | 2309 |
2315 // NOTE: The last range on each stream gets extended to the highest | 2310 // NOTE: The last range on each stream gets extended to the highest |
2316 // end timestamp according to the spec. The last audio range gets extended | 2311 // end timestamp according to the spec. The last audio range gets extended |
2317 // from [200,246) to [200,366) which is why the intersection results in the | 2312 // from [200,246) to [200,366) which is why the intersection results in the |
wolenetz
2014/04/02 00:47:07
s/366/334, but then the rest of the comment is inc
DaleCurtis
2014/04/02 21:53:43
Comment removed. Nah, that avoids the multiple gen
wolenetz
2014/04/03 20:01:40
That's fine, though removing the 299 append would
| |
2318 // middle range getting larger AND the new range appearing. | 2313 // middle range getting larger AND the new range appearing. |
2319 CheckExpectedRanges("{ [0,46) [200,266) [300,366) }"); | 2314 CheckExpectedRanges("{ [0,46) [200,234) [300,334) }"); |
2320 } | 2315 } |
2321 | 2316 |
2322 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) { | 2317 TEST_F(ChunkDemuxerTest, DifferentStreamTimecodes) { |
2323 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); | 2318 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
2324 | 2319 |
2325 // Create a cluster where the video timecode begins 25ms after the audio. | 2320 // Create a cluster where the video timecode begins 25ms after the audio. |
2326 AppendCluster(GenerateCluster(0, 25, 8)); | 2321 AppendCluster(GenerateCluster(0, 25, 8)); |
2327 | 2322 |
2328 Seek(base::TimeDelta::FromSeconds(0)); | 2323 Seek(base::TimeDelta::FromSeconds(0)); |
2329 GenerateExpectedReads(0, 25, 8); | 2324 GenerateExpectedReads(0, 25, 8); |
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2562 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); | 2557 DemuxerStream* audio = demuxer_->GetStream(DemuxerStream::AUDIO); |
2563 | 2558 |
2564 // Fetch initial audio config and verify it matches what we expect. | 2559 // Fetch initial audio config and verify it matches what we expect. |
2565 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config(); | 2560 const AudioDecoderConfig& audio_config_1 = audio->audio_decoder_config(); |
2566 ASSERT_TRUE(audio_config_1.IsValidConfig()); | 2561 ASSERT_TRUE(audio_config_1.IsValidConfig()); |
2567 EXPECT_EQ(audio_config_1.samples_per_second(), 44100); | 2562 EXPECT_EQ(audio_config_1.samples_per_second(), 44100); |
2568 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u); | 2563 EXPECT_EQ(audio_config_1.extra_data_size(), 3863u); |
2569 | 2564 |
2570 ExpectRead(DemuxerStream::AUDIO, 0); | 2565 ExpectRead(DemuxerStream::AUDIO, 0); |
2571 | 2566 |
2567 // The first config change seen is from a splice frame representing an overlap | |
2568 // of buffer from config 1 by buffers from config 2. | |
2572 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | 2569 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); |
2573 | |
2574 ASSERT_EQ(status, DemuxerStream::kConfigChanged); | 2570 ASSERT_EQ(status, DemuxerStream::kConfigChanged); |
2575 EXPECT_EQ(last_timestamp.InMilliseconds(), 524); | 2571 EXPECT_EQ(last_timestamp.InMilliseconds(), 524); |
2572 const AudioDecoderConfig& audio_config_1_too = audio->audio_decoder_config(); | |
wolenetz
2014/04/02 00:47:07
I'm not convinced that we need to emit new, but un
DaleCurtis
2014/04/02 21:53:43
Switched to matches.
wolenetz
2014/04/03 20:01:40
I believe my original question is not yet answered
DaleCurtis
2014/04/08 21:29:08
Every time a config change occurs it must be compl
| |
2573 ASSERT_TRUE(audio_config_1_too.IsValidConfig()); | |
2574 EXPECT_EQ(audio_config_1_too.samples_per_second(), 44100); | |
wolenetz
2014/04/02 00:47:07
nit: directly compare configs using ::Matches(), h
DaleCurtis
2014/04/02 21:53:43
Done.
| |
2575 EXPECT_EQ(audio_config_1_too.extra_data_size(), 3863u); | |
2576 | |
2577 // The next is due to a typical config difference. | |
2578 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | |
2579 ASSERT_EQ(status, DemuxerStream::kConfigChanged); | |
2580 EXPECT_EQ(last_timestamp.InMilliseconds(), 527); | |
2576 | 2581 |
2577 // Fetch the new decoder config. | 2582 // Fetch the new decoder config. |
2578 const AudioDecoderConfig& audio_config_2 = audio->audio_decoder_config(); | 2583 const AudioDecoderConfig& audio_config_2 = audio->audio_decoder_config(); |
2579 ASSERT_TRUE(audio_config_2.IsValidConfig()); | 2584 ASSERT_TRUE(audio_config_2.IsValidConfig()); |
2580 EXPECT_EQ(audio_config_2.samples_per_second(), 44100); | 2585 EXPECT_EQ(audio_config_2.samples_per_second(), 44100); |
2581 EXPECT_EQ(audio_config_2.extra_data_size(), 3935u); | 2586 EXPECT_EQ(audio_config_2.extra_data_size(), 3935u); |
2582 | 2587 |
2583 ExpectRead(DemuxerStream::AUDIO, 527); | 2588 // The next config change is from a splice frame representing an overlap of |
2584 | 2589 // buffers from config 2 by buffers from config 1. |
2585 // Read until the next config change. | |
2586 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | 2590 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); |
2587 ASSERT_EQ(status, DemuxerStream::kConfigChanged); | 2591 ASSERT_EQ(status, DemuxerStream::kConfigChanged); |
2588 EXPECT_EQ(last_timestamp.InMilliseconds(), 759); | 2592 EXPECT_EQ(last_timestamp.InMilliseconds(), 782); |
2593 const AudioDecoderConfig& audio_config_2_too = audio->audio_decoder_config(); | |
2594 ASSERT_TRUE(audio_config_2_too.IsValidConfig()); | |
2595 EXPECT_EQ(audio_config_2_too.samples_per_second(), 44100); | |
2596 EXPECT_EQ(audio_config_2_too.extra_data_size(), 3935u); | |
2597 | |
2598 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | |
2599 | |
2600 ASSERT_EQ(status, DemuxerStream::kConfigChanged); | |
2601 EXPECT_EQ(last_timestamp.InMilliseconds(), 779); | |
2589 | 2602 |
2590 // Get the new config and verify that it matches the first one. | 2603 // Get the new config and verify that it matches the first one. |
2591 ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config())); | 2604 ASSERT_TRUE(audio_config_1.Matches(audio->audio_decoder_config())); |
2592 | 2605 |
2593 ExpectRead(DemuxerStream::AUDIO, 779); | |
2594 | |
2595 // Read until the end of the stream just to make sure there aren't any other | 2606 // Read until the end of the stream just to make sure there aren't any other |
2596 // config changes. | 2607 // config changes. |
2597 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); | 2608 ReadUntilNotOkOrEndOfStream(DemuxerStream::AUDIO, &status, &last_timestamp); |
2598 ASSERT_EQ(status, DemuxerStream::kOk); | 2609 ASSERT_EQ(status, DemuxerStream::kOk); |
2610 EXPECT_EQ(last_timestamp.InMilliseconds(), 2744); | |
2599 } | 2611 } |
2600 | 2612 |
2601 TEST_F(ChunkDemuxerTest, ConfigChange_Seek) { | 2613 TEST_F(ChunkDemuxerTest, ConfigChange_Seek) { |
2602 InSequence s; | 2614 InSequence s; |
2603 | 2615 |
2604 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); | 2616 ASSERT_TRUE(InitDemuxerWithConfigChangeData()); |
2605 | 2617 |
2606 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); | 2618 DemuxerStream* video = demuxer_->GetStream(DemuxerStream::VIDEO); |
2607 | 2619 |
2608 // Fetch initial video config and verify it matches what we expect. | 2620 // Fetch initial video config and verify it matches what we expect. |
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3189 // NOTE: we start at 175 here because the buffer at 125 was returned | 3201 // NOTE: we start at 175 here because the buffer at 125 was returned |
3190 // to the pending read initiated above. | 3202 // to the pending read initiated above. |
3191 CheckExpectedBuffers(text_stream, "175 225"); | 3203 CheckExpectedBuffers(text_stream, "175 225"); |
3192 | 3204 |
3193 // Verify that audio & video streams continue to return expected values. | 3205 // Verify that audio & video streams continue to return expected values. |
3194 CheckExpectedBuffers(audio_stream, "160 180"); | 3206 CheckExpectedBuffers(audio_stream, "160 180"); |
3195 CheckExpectedBuffers(video_stream, "180 210"); | 3207 CheckExpectedBuffers(video_stream, "180 210"); |
3196 } | 3208 } |
3197 | 3209 |
3198 } // namespace media | 3210 } // namespace media |
OLD | NEW |