Chromium Code Reviews| Index: media/filters/chunk_demuxer_unittest.cc |
| diff --git a/media/filters/chunk_demuxer_unittest.cc b/media/filters/chunk_demuxer_unittest.cc |
| index cda4eddaba66808c6cf1fa0255337339c6ffbe55..8549f61ea135a5c04df2bb56243fcb4e5baf8b76 100644 |
| --- a/media/filters/chunk_demuxer_unittest.cc |
| +++ b/media/filters/chunk_demuxer_unittest.cc |
| @@ -119,6 +119,15 @@ MATCHER_P(HasTimestamp, timestamp_in_ms, "") { |
| MATCHER(IsEndOfStream, "") { return arg.get() && arg->end_of_stream(); } |
| +MATCHER_P(SegmentMissingFrames, frame_types_string, "") { |
| + return CONTAINS_STRING(arg, "Media segment did not contain any " + |
| + std::string(frame_types_string) + |
| + " coded frames, mismatching initialization " |
| + "segment. Therefore, MSE coded frame " |
| + "processing may not interoperably detect " |
| + "discontinuities in appended media."); |
| +} |
| + |
| MATCHER(StreamParsingFailed, "") { |
| return CONTAINS_STRING(arg, "Append: stream parsing failed."); |
| } |
| @@ -760,10 +769,6 @@ class ChunkDemuxerTest : public ::testing::Test { |
| EXPECT_EQ(status, expected_status); |
| } |
| - void AppendEmptyCluster(int timecode) { |
| - AppendCluster(GenerateEmptyCluster(timecode)); |
| - } |
| - |
| PipelineStatusCB CreateInitDoneCB(const base::TimeDelta& expected_duration, |
| PipelineStatus expected_status) { |
| if (expected_duration != kNoTimestamp()) |
| @@ -932,7 +937,7 @@ class ChunkDemuxerTest : public ::testing::Test { |
| // seen so far for audio track). |
| // Last video frame has timestamp 2703 and duration 33 (from TrackEntry |
| // DefaultDuration for video track). |
| - CheckExpectedRanges(kSourceId, "{ [0,2736) }"); |
| + CheckExpectedRanges("{ [0,2736) }"); |
| // Append initialization segment for bear2. |
| // Note: Offsets here and below are derived from |
| @@ -947,7 +952,7 @@ class ChunkDemuxerTest : public ::testing::Test { |
| EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)); |
| EXPECT_MEDIA_LOG(GeneratedSplice(20000, 527000)); |
| AppendData(bear2->data() + 55290, 18785); |
| - CheckExpectedRanges(kSourceId, "{ [0,1027) [1201,2736) }"); |
| + CheckExpectedRanges("{ [0,1027) [1201,2736) }"); |
| // Append initialization segment for bear1 & fill gap with [779-1197) |
| // segment. |
| @@ -956,7 +961,7 @@ class ChunkDemuxerTest : public ::testing::Test { |
| EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)); |
| EXPECT_MEDIA_LOG(GeneratedSplice(26000, 779000)); |
| AppendData(bear1->data() + 72737, 28183); |
| - CheckExpectedRanges(kSourceId, "{ [0,2736) }"); |
| + CheckExpectedRanges("{ [0,2736) }"); |
| MarkEndOfStream(PIPELINE_OK); |
| return true; |
| @@ -1150,12 +1155,16 @@ class ChunkDemuxerTest : public ::testing::Test { |
| return cb.Finish(); |
| } |
| + void CheckExpectedRangesForMediaSource(const std::string& expected) { |
| + CheckExpectedRanges(demuxer_->GetBufferedRanges(), expected); |
| + } |
| + |
| void CheckExpectedRanges(const std::string& expected) { |
| CheckExpectedRanges(kSourceId, expected); |
| + CheckExpectedRangesForMediaSource(expected); |
| } |
| - void CheckExpectedRanges(const std::string& id, |
| - const std::string& expected) { |
| + void CheckExpectedRanges(const std::string& id, const std::string& expected) { |
| CheckExpectedRanges(demuxer_->GetBufferedRanges(id), expected); |
| } |
| @@ -1547,7 +1556,7 @@ TEST_F(ChunkDemuxerTest, SingleTextTrackIdChange) { |
| WebMClusterParser::kDefaultVideoBufferDurationInMs), |
| MuxedStreamInfo(kAlternateTextTrackNum, "45K")); |
| - CheckExpectedRanges(kSourceId, "{ [0,92) }"); |
| + CheckExpectedRanges("{ [0,92) }"); |
| CheckExpectedBuffers(audio_stream, "0K 23K 46K 69K"); |
| CheckExpectedBuffers(video_stream, "0K 30 60K"); |
| CheckExpectedBuffers(text_stream, "10K 45K"); |
| @@ -1577,7 +1586,7 @@ TEST_F(ChunkDemuxerTest, InitSegmentSetsNeedRandomAccessPointFlag) { |
| WebMClusterParser::kDefaultAudioBufferDurationInMs), |
| MuxedStreamInfo(kVideoTrackNum, "0 30K", 30), |
| MuxedStreamInfo(kTextTrackNum, "25K 40K")); |
| - CheckExpectedRanges(kSourceId, "{ [23,46) }"); |
| + CheckExpectedRanges("{ [23,46) }"); |
| EXPECT_CALL(*this, InitSegmentReceived()); |
| AppendInitSegment(HAS_TEXT | HAS_AUDIO | HAS_VIDEO); |
| @@ -2086,19 +2095,19 @@ TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) { |
| // Check expected ranges and verify that an empty text track does not |
| // affect the expected ranges. |
| - CheckExpectedRanges(kSourceId, "{ [0,46) }"); |
| + CheckExpectedRanges("{ [0,46) }"); |
| EXPECT_CALL(host_, SetDuration(base::TimeDelta::FromMilliseconds(66))); |
| MarkEndOfStream(PIPELINE_OK); |
| // Check expected ranges and verify that an empty text track does not |
| // affect the expected ranges. |
| - CheckExpectedRanges(kSourceId, "{ [0,66) }"); |
| + CheckExpectedRanges("{ [0,66) }"); |
| // Unmark end of stream state and verify that the ranges return to |
| // their pre-"end of stream" values. |
| demuxer_->UnmarkEndOfStream(); |
| - CheckExpectedRanges(kSourceId, "{ [0,46) }"); |
| + CheckExpectedRanges("{ [0,46) }"); |
| // Add text track data and verify that the buffered ranges don't change |
| // since the intersection of all the tracks doesn't change. |
| @@ -2112,7 +2121,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamRangeChanges) { |
| // Mark end of stream and verify that text track data is reflected in |
| // the new range. |
| MarkEndOfStream(PIPELINE_OK); |
| - CheckExpectedRanges(kSourceId, "{ [0,200) }"); |
| + CheckExpectedRanges("{ [0,200) }"); |
| } |
| // Make sure AppendData() will accept elements that span multiple calls. |
| @@ -2258,7 +2267,6 @@ TEST_F(ChunkDemuxerTest, WebMFile_AltRefFrames) { |
| // Verify that we output buffers before the entire cluster has been parsed. |
| TEST_F(ChunkDemuxerTest, IncrementalClusterParsing) { |
| ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| - AppendEmptyCluster(0); |
| scoped_ptr<Cluster> cluster(GenerateCluster(0, 6)); |
| @@ -2641,6 +2649,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamAfterPastEosSeek) { |
| EXPECT_CALL(host_, SetDuration( |
| base::TimeDelta::FromMilliseconds(120))); |
| MarkEndOfStream(PIPELINE_OK); |
| + CheckExpectedRanges("{ [0,120) }"); |
| message_loop_.RunUntilIdle(); |
| EXPECT_TRUE(seek_cb_was_called); |
| @@ -2739,63 +2748,165 @@ TEST_F(ChunkDemuxerTest, GetBufferedRanges_VideoIdOnly) { |
| CheckExpectedRanges("{ [0,132) [200,299) }"); |
| } |
| -TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { |
| - ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| +TEST_F(ChunkDemuxerTest, GetBufferedRanges_SeparateStreams) { |
| + std::string audio_id = "audio1"; |
| + std::string video_id = "video1"; |
| + ASSERT_TRUE(InitDemuxerAudioAndVideoSources(audio_id, video_id)); |
| + |
| + // Append audio and video data into separate source ids. |
| - // Audio: 0 -> 23 |
| - // Video: 0 -> 33 |
| + // Audio block: 0 -> 23 |
| + // Video block: 0 -> 33 |
| // Buffered Range: 0 -> 23 |
| // Audio block duration is smaller than video block duration, |
| // so the buffered ranges should correspond to the audio blocks. |
| - AppendCluster(GenerateSingleStreamCluster( |
| - 0, kAudioBlockDuration, kAudioTrackNum, kAudioBlockDuration)); |
| - AppendCluster(GenerateSingleStreamCluster( |
| - 0, kVideoBlockDuration, kVideoTrackNum, kVideoBlockDuration)); |
| - |
| - CheckExpectedRanges("{ [0,23) }"); |
| - |
| - // Audio: 300 -> 400 |
| - // Video: 320 -> 420 |
| - // Buffered Range: 320 -> 400 (end overlap) |
| - AppendCluster(GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50)); |
| - AppendCluster(GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50)); |
| - |
| - CheckExpectedRanges("{ [0,23) [320,400) }"); |
| - |
| - // Audio: 520 -> 590 |
| - // Video: 500 -> 570 |
| - // Buffered Range: 520 -> 570 (front overlap) |
| - AppendCluster(GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70)); |
| - AppendCluster(GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70)); |
| + AppendCluster(audio_id, |
| + GenerateSingleStreamCluster(0, 23, kAudioTrackNum, 23)); |
| + AppendCluster(video_id, |
| + GenerateSingleStreamCluster(0, 33, kVideoTrackNum, 33)); |
| + CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }"); |
| + CheckExpectedRangesForMediaSource("{ [0,23) }"); |
| + |
| + // Audio blocks: 300 -> 400 |
| + // Video blocks: 320 -> 420 |
| + // Buffered Range: 320 -> 400 (jagged start and end across SourceBuffers) |
| + AppendCluster(audio_id, |
| + GenerateSingleStreamCluster(300, 400, kAudioTrackNum, 50)); |
| + AppendCluster(video_id, |
| + GenerateSingleStreamCluster(320, 420, kVideoTrackNum, 50)); |
| + CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) }"); |
| + CheckExpectedRangesForMediaSource("{ [0,23) [320,400) }"); |
| + |
| + // Audio block: 520 -> 590 |
| + // Video block: 500 -> 570 |
| + // Buffered Range: 520 -> 570 (jagged start and end across SourceBuffers) |
| + AppendCluster(audio_id, |
| + GenerateSingleStreamCluster(520, 590, kAudioTrackNum, 70)); |
| + AppendCluster(video_id, |
| + GenerateSingleStreamCluster(500, 570, kVideoTrackNum, 70)); |
| + CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [520,590) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [320,420) [500,570) }"); |
| + CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) }"); |
| + |
| + // Audio block: 720 -> 750 |
| + // Video block: 700 -> 770 |
| + // Buffered Range: 720 -> 750 (complete overlap of audio) |
| + AppendCluster(audio_id, |
| + GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30)); |
| + AppendCluster(video_id, |
| + GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70)); |
| + CheckExpectedRanges(DemuxerStream::AUDIO, |
| + "{ [0,23) [300,400) [520,590) [720,750) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, |
| + "{ [0,33) [320,420) [500,570) [700,770) }"); |
| + CheckExpectedRangesForMediaSource("{ [0,23) [320,400) [520,570) [720,750) }"); |
| + |
| + // Audio block: 900 -> 970 |
| + // Video block: 920 -> 950 |
| + // Buffered Range: 920 -> 950 (complete overlap of video) |
| + AppendCluster(audio_id, |
| + GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70)); |
| + AppendCluster(video_id, |
| + GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30)); |
| + CheckExpectedRanges(DemuxerStream::AUDIO, |
| + "{ [0,23) [300,400) [520,590) [720,750) [900,970) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, |
| + "{ [0,33) [320,420) [500,570) [700,770) [920,950) }"); |
| + CheckExpectedRangesForMediaSource( |
| + "{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); |
| - CheckExpectedRanges("{ [0,23) [320,400) [520,570) }"); |
| + // Appending within buffered range should not affect buffered ranges. |
| + EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000)); |
| + AppendCluster(audio_id, |
| + GenerateSingleStreamCluster(930, 950, kAudioTrackNum, 20)); |
| + AppendCluster(video_id, |
| + GenerateSingleStreamCluster(930, 950, kVideoTrackNum, 20)); |
| + CheckExpectedRanges(DemuxerStream::AUDIO, |
| + "{ [0,23) [300,400) [520,590) [720,750) [900,970) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, |
| + "{ [0,33) [320,420) [500,570) [700,770) [920,950) }"); |
| + CheckExpectedRangesForMediaSource( |
| + "{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); |
| +} |
| - // Audio: 720 -> 750 |
| - // Video: 700 -> 770 |
| - // Buffered Range: 720 -> 750 (complete overlap, audio) |
| - AppendCluster(GenerateSingleStreamCluster(720, 750, kAudioTrackNum, 30)); |
| - AppendCluster(GenerateSingleStreamCluster(700, 770, kVideoTrackNum, 70)); |
| +TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideo) { |
| + ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| - CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) }"); |
| + // Audio block: 0 -> 23 |
| + // Video block: 0 -> 33 |
| + // Buffered Range: 0 -> 23 |
| + // Audio block duration is smaller than video block duration, |
| + // so the buffered ranges should correspond to the audio blocks. |
| + AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0D23K"), |
| + MuxedStreamInfo(kVideoTrackNum, "0D33K")); |
| - // Audio: 900 -> 970 |
| - // Video: 920 -> 950 |
| - // Buffered Range: 920 -> 950 (complete overlap, video) |
| - AppendCluster(GenerateSingleStreamCluster(900, 970, kAudioTrackNum, 70)); |
| - AppendCluster(GenerateSingleStreamCluster(920, 950, kVideoTrackNum, 30)); |
| + CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) }"); |
| + CheckExpectedRanges("{ [0,23) }"); |
| - CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); |
| + // Audio blocks: 300 -> 400 |
| + // Video blocks: 320 -> 420 |
| + // Naive Buffered Range: 320 -> 400 (end overlap) ** |
| + // **Except these are in the same cluster, with same segment start time of |
| + // 300, so the added buffered range is 300 -> 400 (still with end overlap) |
| + AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "300K 350D50K"), |
| + MuxedStreamInfo(kVideoTrackNum, "320K 370D50K")); |
| + |
| + CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [300,420) }"); |
| + CheckExpectedRanges("{ [0,23) [300,400) }"); |
| + |
| + // Audio block: 520 -> 590 |
| + // Video block: 500 -> 570 |
| + // Naive Buffered Range: 520 -> 570 (front overlap) ** |
| + // **Except these are in the same cluster, with same segment start time of |
| + // 500, so the added buffered range is 500 -> 570 |
| + AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "520D70K"), |
| + MuxedStreamInfo(kVideoTrackNum, "500D70K")); |
| + |
| + CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,23) [300,400) [500,590) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,33) [300,420) [500,570) }"); |
| + CheckExpectedRanges("{ [0,23) [300,400) [500,570) }"); |
| + |
| + // Audio block: 720 -> 750 |
| + // Video block: 700 -> 770 |
| + // Naive Buffered Range: 720 -> 750 (complete overlap, audio) ** |
| + // **Except these are in the same cluster, with same segment start time of |
| + // 700, so the added buffered range is 700 -> 750 |
| + AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "720D30K"), |
| + MuxedStreamInfo(kVideoTrackNum, "700D70K")); |
| + |
| + CheckExpectedRanges(DemuxerStream::AUDIO, |
| + "{ [0,23) [300,400) [500,590) [700,750) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, |
| + "{ [0,33) [300,420) [500,570) [700,770) }"); |
| + CheckExpectedRanges("{ [0,23) [300,400) [500,570) [700,750) }"); |
| + |
| + // Audio block: 900 -> 970 |
| + // Video block: 920 -> 950 |
| + // Naive Buffered Range: 920 -> 950 (complete overlap, video) ** |
| + // **Except these are in the same cluster, with same segment start time of |
| + // 900, so the added buffered range is 900 -> 950 |
| + AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "900D70K"), |
| + MuxedStreamInfo(kVideoTrackNum, "920D30K")); |
| + |
| + CheckExpectedRanges(DemuxerStream::AUDIO, |
| + "{ [0,23) [300,400) [500,590) [700,750) [900,970) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, |
| + "{ [0,33) [300,420) [500,570) [700,770) [900,950) }"); |
| + CheckExpectedRanges("{ [0,23) [300,400) [500,570) [700,750) [900,950) }"); |
| // Appending within buffered range should not affect buffered ranges. |
| EXPECT_MEDIA_LOG(GeneratedSplice(40000, 930000)); |
| AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "930D20K"), |
| MuxedStreamInfo(kVideoTrackNum, "930D20K")); |
| - CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); |
| - |
| - // Appending to single stream outside buffered ranges should not affect |
| - // buffered ranges. |
| - AppendCluster(GenerateSingleStreamCluster(1230, 1240, kVideoTrackNum, 10)); |
| - CheckExpectedRanges("{ [0,23) [320,400) [520,570) [720,750) [920,950) }"); |
| + CheckExpectedRanges(DemuxerStream::AUDIO, |
| + "{ [0,23) [300,400) [500,590) [700,750) [900,970) }"); |
| + CheckExpectedRanges(DemuxerStream::VIDEO, |
| + "{ [0,33) [300,420) [500,570) [700,770) [900,950) }"); |
| + CheckExpectedRanges("{ [0,23) [300,400) [500,570) [700,750) [900,950) }"); |
| } |
| TEST_F(ChunkDemuxerTest, GetBufferedRanges_AudioVideoText) { |
| @@ -2940,18 +3051,6 @@ TEST_F(ChunkDemuxerTest, DifferentStreamTimecodesOutOfRange) { |
| ExpectEndOfStream(DemuxerStream::VIDEO); |
| } |
| -TEST_F(ChunkDemuxerTest, ClusterWithNoBuffers) { |
| - ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| - |
| - // Generate and append an empty cluster beginning at 0. |
| - AppendEmptyCluster(0); |
| - |
| - // Sanity check that data can be appended after this cluster correctly. |
| - AppendCluster(GenerateCluster(0, 2)); |
| - ExpectRead(DemuxerStream::AUDIO, 0); |
| - ExpectRead(DemuxerStream::VIDEO, 0); |
| -} |
| - |
| TEST_F(ChunkDemuxerTest, CodecPrefixMatching) { |
| ChunkDemuxer::Status expected = ChunkDemuxer::kNotSupported; |
| @@ -3374,27 +3473,65 @@ TEST_F(ChunkDemuxerTest, SeekCompleteDuringAbort) { |
| TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) { |
| const uint8_t kBuffer[] = { |
| - 0x1F, 0x43, 0xB6, 0x75, 0x83, // CLUSTER (size = 3) |
| - 0xE7, 0x81, 0x01, // Cluster TIMECODE (value = 1) |
| - |
| - 0x1F, 0x43, 0xB6, 0x75, |
| - 0xFF, // CLUSTER (size = unknown; really 3 due to:) |
| - 0xE7, 0x81, 0x02, // Cluster TIMECODE (value = 2) |
| - /* e.g. put some blocks here... */ |
| - 0x1A, 0x45, 0xDF, 0xA3, |
| - 0x8A, // EBMLHEADER (size = 10, not fully appended) |
| + // CLUSTER (size = 10) |
| + 0x1F, 0x43, 0xB6, 0x75, 0x8A, |
| + |
| + // Cluster TIMECODE (value = 1) |
| + 0xE7, 0x81, 0x01, |
| + |
| + // SIMPLEBLOCK (size = 5) |
| + 0xA3, 0x85, |
| + |
| + // Audio Track Number |
| + 0x80 | (kAudioTrackNum & 0x7F), |
| + |
| + // Timecode (relative to cluster) (value = 0) |
| + 0x00, 0x00, |
| + |
| + // Keyframe flag |
| + 0x80, |
| + |
| + // Fake block data |
| + 0x00, |
| + |
| + // CLUSTER (size = unknown; really 10) |
| + 0x1F, 0x43, 0xB6, 0x75, 0xFF, |
| + |
| + // Cluster TIMECODE (value = 2) |
| + 0xE7, 0x81, 0x02, |
| + |
| + // SIMPLEBLOCK (size = 5) |
| + 0xA3, 0x85, |
| + |
| + // Audio Track Number |
| + 0x80 | (kAudioTrackNum & 0x7F), |
| + |
| + // Timecode (relative to cluster) (value = 0) |
| + 0x00, 0x00, |
| + |
| + // Keyframe flag |
| + 0x80, |
| + |
| + // Fake block data |
| + 0x00, |
| + |
| + // EBMLHEADER (size = 10, not fully appended) |
| + 0x1A, 0x45, 0xDF, 0xA3, 0x8A, |
|
chcunningham
2016/01/20 00:40:59
Is this part needed?
wolenetz
2016/01/20 00:45:48
Indeed it is. The termination of an "unknown"-size
|
| }; |
| // This array indicates expected return value of IsParsingMediaSegment() |
| // following each incrementally appended byte in |kBuffer|. |
| const bool kExpectedReturnValues[] = { |
| - false, false, false, false, true, |
| - true, true, false, |
| + // First Cluster, explicit size |
| + false, false, false, false, true, true, true, true, true, true, true, |
| + true, true, true, false, |
| - false, false, false, false, true, |
| - true, true, true, |
| + // Second Cluster, unknown size |
| + false, false, false, false, true, true, true, true, true, true, true, |
| + true, true, true, true, |
| - true, true, true, true, false, |
| + // EBMLHEADER |
| + true, true, true, true, false, |
| }; |
| static_assert(arraysize(kBuffer) == arraysize(kExpectedReturnValues), |
| @@ -3402,8 +3539,9 @@ TEST_F(ChunkDemuxerTest, WebMIsParsingMediaSegmentDetection) { |
| static_assert(arraysize(kBuffer) == sizeof(kBuffer), |
| "there should be one byte per index"); |
| - ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| - |
| + ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); |
| + EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(23)).Times(2); |
| + EXPECT_MEDIA_LOG(GeneratedSplice(22000, 2000)); |
| for (size_t i = 0; i < sizeof(kBuffer); i++) { |
| DVLOG(3) << "Appending and testing index " << i; |
| AppendData(kBuffer + i, 1); |
| @@ -3422,7 +3560,7 @@ TEST_F(ChunkDemuxerTest, DurationChange) { |
| kStreamDuration - kVideoBlockDuration, |
| 2)); |
| - CheckExpectedRanges(kSourceId, "{ [201191,201224) }"); |
| + CheckExpectedRanges("{ [201191,201224) }"); |
| // Add data beginning at the currently set duration and expect a new duration |
| // to be signaled. Note that the last video block will have a higher end |
| @@ -3432,7 +3570,7 @@ TEST_F(ChunkDemuxerTest, DurationChange) { |
| base::TimeDelta::FromMilliseconds(kNewStreamDurationVideo))); |
| AppendCluster(GenerateCluster(kDefaultDuration().InMilliseconds(), 2)); |
| - CheckExpectedRanges(kSourceId, "{ [201191,201247) }"); |
| + CheckExpectedRanges("{ [201191,201247) }"); |
| // Add more data to the end of each media type. Note that the last audio block |
| // will have a higher end timestamp than the last video block. |
| @@ -3445,7 +3583,7 @@ TEST_F(ChunkDemuxerTest, DurationChange) { |
| // See that the range has increased appropriately (but not to the full |
| // duration of 201293, since there is not enough video appended for that). |
| - CheckExpectedRanges(kSourceId, "{ [201191,201290) }"); |
| + CheckExpectedRanges("{ [201191,201290) }"); |
| } |
| TEST_F(ChunkDemuxerTest, DurationChangeTimestampOffset) { |
| @@ -3505,7 +3643,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { |
| AppendCluster(0, 10); |
| AppendCluster(300, 10); |
| - CheckExpectedRanges(kSourceId, "{ [0,132) [300,432) }"); |
| + CheckExpectedRanges("{ [0,132) [300,432) }"); |
| GenerateExpectedReads(0, 10); |
| @@ -3535,7 +3673,7 @@ TEST_F(ChunkDemuxerTest, EndOfStreamWhileWaitingForGapToBeFilled) { |
| message_loop_.RunUntilIdle(); |
| - CheckExpectedRanges(kSourceId, "{ [0,435) }"); |
| + CheckExpectedRanges("{ [0,435) }"); |
| // Verify that the reads have completed. |
| EXPECT_TRUE(audio_read_done); |
| @@ -3622,7 +3760,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekForward) { |
| demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize); |
| // Append some data at position 1000ms |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 10); |
| - CheckExpectedRanges(kSourceId, "{ [1000,1230) }"); |
| + CheckExpectedRanges("{ [1000,1230) }"); |
| // GC should be able to evict frames in the currently buffered range, since |
| // those frames are earlier than the seek target position. |
| @@ -3632,7 +3770,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekForward) { |
| // Append data to complete seek operation |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5); |
| - CheckExpectedRanges(kSourceId, "{ [1115,1230) [2000,2115) }"); |
| + CheckExpectedRanges("{ [1115,1230) [2000,2115) }"); |
| } |
| TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekBack) { |
| @@ -3640,7 +3778,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekBack) { |
| demuxer_->SetMemoryLimits(DemuxerStream::AUDIO, 10 * kBlockSize); |
| // Append some data at position 1000ms |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 10); |
| - CheckExpectedRanges(kSourceId, "{ [1000,1230) }"); |
| + CheckExpectedRanges("{ [1000,1230) }"); |
| // GC should be able to evict frames in the currently buffered range, since |
| // seek target position has no data and so we should allow some frames to be |
| @@ -3651,7 +3789,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_SingleRange_SeekBack) { |
| // Append data to complete seek operation |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 5); |
| - CheckExpectedRanges(kSourceId, "{ [0,115) [1115,1230) }"); |
| + CheckExpectedRanges("{ [0,115) [1115,1230) }"); |
| } |
| TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekForward) { |
| @@ -3660,7 +3798,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekForward) { |
| // Append some data at position 1000ms then at 2000ms |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5); |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5); |
| - CheckExpectedRanges(kSourceId, "{ [1000,1115) [2000,2115) }"); |
| + CheckExpectedRanges("{ [1000,1115) [2000,2115) }"); |
| // GC should be able to evict frames in the currently buffered ranges, since |
| // those frames are earlier than the seek target position. |
| @@ -3670,7 +3808,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekForward) { |
| // Append data to complete seek operation |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 3000, 5); |
| - CheckExpectedRanges(kSourceId, "{ [2069,2115) [3000,3115) }"); |
| + CheckExpectedRanges("{ [2069,2115) [3000,3115) }"); |
| } |
| TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween1) { |
| @@ -3679,7 +3817,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween1) { |
| // Append some data at position 1000ms then at 2000ms |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5); |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5); |
| - CheckExpectedRanges(kSourceId, "{ [1000,1115) [2000,2115) }"); |
| + CheckExpectedRanges("{ [1000,1115) [2000,2115) }"); |
| // GC should be able to evict all frames from the first buffered range, since |
| // those frames are earlier than the seek target position. But there's only 5 |
| @@ -3695,7 +3833,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween1) { |
| // Append data to complete seek operation |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1500, 5); |
| - CheckExpectedRanges(kSourceId, "{ [1500,1615) [2069,2115) }"); |
| + CheckExpectedRanges("{ [1500,1615) [2069,2115) }"); |
| } |
| TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween2) { |
| @@ -3707,7 +3845,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween2) { |
| // GC algorithm since it tries to preserve more recently appended data). |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5); |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5); |
| - CheckExpectedRanges(kSourceId, "{ [1000,1115) [2000,2115) }"); |
| + CheckExpectedRanges("{ [1000,1115) [2000,2115) }"); |
| // Now try performing garbage collection without announcing seek first, i.e. |
| // without calling Seek(), the GC algorithm should try to preserve data in the |
| @@ -3716,7 +3854,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekInbetween2) { |
| EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time, 5 * kBlockSize)); |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1500, 5); |
| - CheckExpectedRanges(kSourceId, "{ [1000,1115) [1500,1615) }"); |
| + CheckExpectedRanges("{ [1000,1115) [1500,1615) }"); |
| } |
| TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekBack) { |
| @@ -3725,7 +3863,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekBack) { |
| // Append some data at position 1000ms then at 2000ms |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 1000, 5); |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 2000, 5); |
| - CheckExpectedRanges(kSourceId, "{ [1000,1115) [2000,2115) }"); |
| + CheckExpectedRanges("{ [1000,1115) [2000,2115) }"); |
| // GC should be able to evict frames in the currently buffered ranges, since |
| // those frames are earlier than the seek target position. |
| @@ -3735,7 +3873,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek_MultipleRanges_SeekBack) { |
| // Append data to complete seek operation |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 5); |
| - CheckExpectedRanges(kSourceId, "{ [0,115) [2069,2115) }"); |
| + CheckExpectedRanges("{ [0,115) [2069,2115) }"); |
| } |
| TEST_F(ChunkDemuxerTest, GCDuringSeek) { |
| @@ -3752,11 +3890,11 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek) { |
| // Append data to satisfy the first seek request. |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, |
| seek_time1.InMilliseconds(), 5); |
| - CheckExpectedRanges(kSourceId, "{ [1000,1115) }"); |
| + CheckExpectedRanges("{ [1000,1115) }"); |
| // We are under memory limit, so Evict should be a no-op. |
| EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time1, 0)); |
| - CheckExpectedRanges(kSourceId, "{ [1000,1115) }"); |
| + CheckExpectedRanges("{ [1000,1115) }"); |
| // Signal that the second seek is starting. |
| demuxer_->StartWaitingForSeek(seek_time2); |
| @@ -3764,13 +3902,13 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek) { |
| // Append data to satisfy the second seek. |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, |
| seek_time2.InMilliseconds(), 5); |
| - CheckExpectedRanges(kSourceId, "{ [500,615) [1000,1115) }"); |
| + CheckExpectedRanges("{ [500,615) [1000,1115) }"); |
| // We are now over our memory usage limit. We have just seeked to |seek_time2| |
| // so data around 500ms position should be preserved, while the previous |
| // append at 1000ms should be removed. |
| EXPECT_TRUE(demuxer_->EvictCodedFrames(kSourceId, seek_time2, 0)); |
| - CheckExpectedRanges(kSourceId, "{ [500,615) }"); |
| + CheckExpectedRanges("{ [500,615) }"); |
| // Complete the seek. |
| demuxer_->Seek(seek_time2, NewExpectedStatusCB(PIPELINE_OK)); |
| @@ -3780,7 +3918,7 @@ TEST_F(ChunkDemuxerTest, GCDuringSeek) { |
| // and the newly appended range, since this is the most recent append. |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 700, 5); |
| EXPECT_FALSE(demuxer_->EvictCodedFrames(kSourceId, seek_time2, 0)); |
| - CheckExpectedRanges(kSourceId, "{ [500,615) [700,815) }"); |
| + CheckExpectedRanges("{ [500,615) [700,815) }"); |
| } |
| TEST_F(ChunkDemuxerTest, GCKeepPlayhead) { |
| @@ -3790,26 +3928,26 @@ TEST_F(ChunkDemuxerTest, GCKeepPlayhead) { |
| // Append data at the start that can be garbage collected: |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10); |
| - CheckExpectedRanges(kSourceId, "{ [0,230) }"); |
| + CheckExpectedRanges("{ [0,230) }"); |
| // We expect garbage collection to fail, as we don't want to spontaneously |
| // create gaps in source buffer stream. Gaps could break playback for many |
| // clients, who don't bother to check ranges after append. |
| EXPECT_FALSE(demuxer_->EvictCodedFrames( |
| kSourceId, base::TimeDelta::FromMilliseconds(0), 0)); |
| - CheckExpectedRanges(kSourceId, "{ [0,230) }"); |
| + CheckExpectedRanges("{ [0,230) }"); |
| // Increase media_time a bit, this will allow some data to be collected, but |
| // we are still over memory usage limit. |
| base::TimeDelta seek_time1 = base::TimeDelta::FromMilliseconds(23*2); |
| Seek(seek_time1); |
| EXPECT_FALSE(demuxer_->EvictCodedFrames(kSourceId, seek_time1, 0)); |
| - CheckExpectedRanges(kSourceId, "{ [46,230) }"); |
| + CheckExpectedRanges("{ [46,230) }"); |
| base::TimeDelta seek_time2 = base::TimeDelta::FromMilliseconds(23*4); |
| Seek(seek_time2); |
| EXPECT_FALSE(demuxer_->EvictCodedFrames(kSourceId, seek_time2, 0)); |
| - CheckExpectedRanges(kSourceId, "{ [92,230) }"); |
| + CheckExpectedRanges("{ [92,230) }"); |
| // media_time has progressed to a point where we can collect enough data to |
| // be under memory limit, so Evict should return true. |
| @@ -3819,7 +3957,7 @@ TEST_F(ChunkDemuxerTest, GCKeepPlayhead) { |
| // Strictly speaking the current playback time is 23*6==138ms, so we could |
| // release data up to 138ms, but we only release as much data as necessary |
| // to bring memory usage under the limit, so we release only up to 115ms. |
| - CheckExpectedRanges(kSourceId, "{ [115,230) }"); |
| + CheckExpectedRanges("{ [115,230) }"); |
| } |
| TEST_F(ChunkDemuxerTest, AppendWindow_Video) { |
| @@ -3838,7 +3976,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) { |
| // Verify that GOPs that start outside the window are not included |
| // in the buffer. Also verify that buffers that start inside the |
| // window and extend beyond the end of the window are not included. |
| - CheckExpectedRanges(kSourceId, "{ [120,270) }"); |
| + CheckExpectedRanges("{ [120,270) }"); |
| CheckExpectedBuffers(stream, "120K 150 180 210 240K"); |
| // Extend the append window to [50,650). |
| @@ -3849,7 +3987,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Video) { |
| EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30)); |
| AppendSingleStreamCluster(kSourceId, kVideoTrackNum, |
| "360 390 420K 450 480 510 540K 570 600 630K"); |
| - CheckExpectedRanges(kSourceId, "{ [120,270) [420,630) }"); |
| + CheckExpectedRanges("{ [120,270) [420,630) }"); |
| } |
| TEST_F(ChunkDemuxerTest, AppendWindow_Audio) { |
| @@ -3872,7 +4010,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Audio) { |
| // |
| // The first 50ms of the range should be truncated since it overlaps |
| // the start of the append window. |
| - CheckExpectedRanges(kSourceId, "{ [50,280) }"); |
| + CheckExpectedRanges("{ [50,280) }"); |
| // The "50P" buffer is the "0" buffer marked for complete discard. The next |
| // "50" buffer is the "30" buffer marked with 20ms of start discard. |
| @@ -3886,7 +4024,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Audio) { |
| AppendSingleStreamCluster( |
| kSourceId, kAudioTrackNum, |
| "360K 390K 420K 450K 480K 510K 540K 570K 600K 630K"); |
| - CheckExpectedRanges(kSourceId, "{ [50,280) [360,650) }"); |
| + CheckExpectedRanges("{ [50,280) [360,650) }"); |
| } |
| TEST_F(ChunkDemuxerTest, AppendWindow_AudioOverlapStartAndEnd) { |
| @@ -3902,7 +4040,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioOverlapStartAndEnd) { |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, "0K"); |
| // Verify the append is clipped to the append window. |
| - CheckExpectedRanges(kSourceId, "{ [10,20) }"); |
| + CheckExpectedRanges("{ [10,20) }"); |
| } |
| TEST_F(ChunkDemuxerTest, AppendWindow_WebMFile_AudioOnly) { |
| @@ -3953,7 +4091,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { |
| EXPECT_CALL(*this, InitSegmentReceived()); |
| EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(2)); |
| AppendDataInPieces(buffer->data(), buffer->data_size(), 512); |
| - CheckExpectedRanges(kSourceId, "{ }"); |
| + CheckExpectedRanges("{ }"); |
| DemuxerStream* stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
| AudioDecoderConfig config_1 = stream->audio_decoder_config(); |
| @@ -3966,7 +4104,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_AudioConfigUpdateRemovesPreroll) { |
| EXPECT_CALL(host_, SetDuration(_)).Times(AnyNumber()); |
| ASSERT_TRUE(SetTimestampOffset(kSourceId, duration_1)); |
| AppendDataInPieces(buffer2->data(), buffer2->data_size(), 512); |
| - CheckExpectedRanges(kSourceId, "{ [2746,5519) }"); |
| + CheckExpectedRanges("{ [2746,5519) }"); |
| Seek(duration_1); |
| ExpectConfigChanged(DemuxerStream::AUDIO); |
| @@ -3995,7 +4133,7 @@ TEST_F(ChunkDemuxerTest, AppendWindow_Text) { |
| // Verify that text cues that start outside the window are not included |
| // in the buffer. Also verify that cues that extend beyond the |
| // window are not included. |
| - CheckExpectedRanges(kSourceId, "{ [100,270) }"); |
| + CheckExpectedRanges("{ [100,270) }"); |
| CheckExpectedBuffers(video_stream, "120K 150 180 210 240K"); |
| CheckExpectedBuffers(text_stream, "100K"); |
| @@ -4047,7 +4185,7 @@ TEST_F(ChunkDemuxerTest, Remove_AudioVideoText) { |
| base::TimeDelta::FromMilliseconds(300)); |
| // Verify that all the appended data has been removed. |
| - CheckExpectedRanges(kSourceId, "{ }"); |
| + CheckExpectedRanges("{ }"); |
| // Append new buffers that are clearly different than the original |
| // ones and verify that only the new buffers are returned. |
| @@ -4077,7 +4215,7 @@ TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) { |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, |
| "0K 20K 40K 60K 80K 100K 120K 140D20K"); |
| - CheckExpectedRanges(kSourceId, "{ [0,160) }"); |
| + CheckExpectedRanges("{ [0,160) }"); |
| CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K"); |
| demuxer_->Remove(kSourceId, |
| @@ -4085,7 +4223,7 @@ TEST_F(ChunkDemuxerTest, Remove_StartAtDuration) { |
| kInfiniteDuration()); |
| Seek(base::TimeDelta()); |
| - CheckExpectedRanges(kSourceId, "{ [0,160) }"); |
| + CheckExpectedRanges("{ [0,160) }"); |
| CheckExpectedBuffers(audio_stream, "0K 20K 40K 60K 80K 100K 120K 140K"); |
| } |
| @@ -4153,11 +4291,11 @@ TEST_F(ChunkDemuxerTest, ClusterWithUnknownSize) { |
| ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| AppendCluster(GenerateCluster(0, 0, 4, true)); |
| - CheckExpectedRanges(kSourceId, "{ [0,46) }"); |
| + CheckExpectedRanges("{ [0,46) }"); |
| // A new cluster indicates end of the previous cluster with unknown size. |
| AppendCluster(GenerateCluster(46, 66, 5, true)); |
| - CheckExpectedRanges(kSourceId, "{ [0,115) }"); |
| + CheckExpectedRanges("{ [0,115) }"); |
| } |
| TEST_F(ChunkDemuxerTest, CuesBetweenClustersWithUnknownSize) { |
| @@ -4171,7 +4309,7 @@ TEST_F(ChunkDemuxerTest, CuesBetweenClustersWithUnknownSize) { |
| data.insert(data.end(), cluster->data(), cluster->data() + cluster->size()); |
| AppendData(&*data.begin(), data.size()); |
| - CheckExpectedRanges(kSourceId, "{ [0,115) }"); |
| + CheckExpectedRanges("{ [0,115) }"); |
| } |
| TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { |
| @@ -4180,7 +4318,7 @@ TEST_F(ChunkDemuxerTest, CuesBetweenClusters) { |
| AppendCluster(GenerateCluster(0, 0, 4)); |
| AppendData(kCuesHeader, sizeof(kCuesHeader)); |
| AppendCluster(GenerateCluster(46, 66, 5)); |
| - CheckExpectedRanges(kSourceId, "{ [0,115) }"); |
| + CheckExpectedRanges("{ [0,115) }"); |
| } |
| TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) { |
| @@ -4233,4 +4371,34 @@ TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) { |
| CheckExpectedBuffers(video_stream, "60K 70 80K 90 100K 110 120K 130 140K"); |
| } |
| +TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioOnly) { |
| + ASSERT_TRUE(InitDemuxer(HAS_AUDIO)); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("audio")); |
| + AppendCluster(GenerateEmptyCluster(0)); |
| +} |
| + |
| +TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_VideoOnly) { |
| + ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); |
| + AppendCluster(GenerateEmptyCluster(0)); |
| +} |
| + |
| +TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioVideo) { |
| + ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("audio")); |
| + AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 10); |
| +} |
| + |
| +TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_AudioVideo) { |
| + ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); |
| + AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10); |
| +} |
| + |
| +TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) { |
| + ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video")); |
| + AppendCluster(GenerateEmptyCluster(0)); |
| +} |
| + |
| } // namespace media |