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 0d7c9a1c0d04b668ef4789ac40576f72dcad1290..3155d5e3fdb77442205979632baeb5978452b1c1 100644 |
| --- a/media/filters/chunk_demuxer_unittest.cc |
| +++ b/media/filters/chunk_demuxer_unittest.cc |
| @@ -125,13 +125,10 @@ 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_P(SegmentMissingFrames, track_id, "") { |
| + return CONTAINS_STRING( |
| + arg, "Media segment did not contain any coded frames for track " + |
| + std::string(track_id)); |
| } |
| MATCHER(StreamParsingFailed, "") { |
| @@ -150,19 +147,15 @@ MATCHER_P2(CodecName, stream_type_string, codec_string, "") { |
| CONTAINS_STRING(arg, std::string(codec_string)); |
| } |
| -MATCHER_P2(InitSegmentMismatchesMimeType, |
| - track_type_string_with_article, |
| - mime_missing_track_type_bool, |
| - "") { |
| - return CONTAINS_STRING( |
| - arg, "Initialization segment " + |
| - std::string(mime_missing_track_type_bool ? "has " |
| - : "does not have ") + |
| - std::string(track_type_string_with_article) + |
| - " track, but the mimetype " + |
| - std::string(mime_missing_track_type_bool ? "does not specify " |
| - : "specifies ") + |
| - std::string(track_type_string_with_article) + " codec."); |
| +MATCHER_P2(InitSegmentMismatchesMimeType, stream_type, codec_name, "") { |
| + return CONTAINS_STRING(arg, std::string(stream_type) + " stream codec " + |
| + std::string(codec_name) + |
| + " doesn't match SourceBuffer codecs."); |
| +} |
| + |
| +MATCHER_P(InitSegmentMissesExpectedTrack, missing_codec, "") { |
| + return CONTAINS_STRING(arg, "Initialization segment misses expected " + |
| + std::string(missing_codec) + " track."); |
| } |
| MATCHER_P2(GeneratedSplice, duration_microseconds, time_microseconds, "") { |
| @@ -388,22 +381,6 @@ class ChunkDemuxerTest : public ::testing::Test { |
| // TODO(xhwang): Simplify this! Probably have test data files that contain |
| // ContentEncodings directly instead of trying to create one at run-time. |
| - if (has_audio) { |
| - memcpy(buf, audio_track_entry->data(), |
| - audio_track_entry->data_size()); |
| - if (is_audio_encrypted) { |
| - memcpy(buf + audio_track_entry->data_size(), |
| - audio_content_encodings->data(), |
| - audio_content_encodings->data_size()); |
| - WriteInt64(buf + kAudioTrackSizeOffset, |
| - audio_track_entry->data_size() + |
| - audio_content_encodings->data_size() - |
| - kAudioTrackEntryHeaderSize); |
| - buf += audio_content_encodings->data_size(); |
| - } |
| - buf += audio_track_entry->data_size(); |
| - } |
| - |
| if (has_video) { |
| memcpy(buf, video_track_entry->data(), |
| video_track_entry->data_size()); |
| @@ -420,6 +397,21 @@ class ChunkDemuxerTest : public ::testing::Test { |
| buf += video_track_entry->data_size(); |
| } |
| + if (has_audio) { |
| + memcpy(buf, audio_track_entry->data(), audio_track_entry->data_size()); |
|
wolenetz
2016/09/13 21:03:13
aside: Why reorder this block here vs before "if (
servolk
2016/09/14 18:15:24
Some tests in this file verify that media log even
wolenetz
2016/09/14 23:31:21
Acknowledged.
|
| + if (is_audio_encrypted) { |
| + memcpy(buf + audio_track_entry->data_size(), |
| + audio_content_encodings->data(), |
| + audio_content_encodings->data_size()); |
| + WriteInt64(buf + kAudioTrackSizeOffset, |
| + audio_track_entry->data_size() + |
| + audio_content_encodings->data_size() - |
| + kAudioTrackEntryHeaderSize); |
| + buf += audio_content_encodings->data_size(); |
| + } |
| + buf += audio_track_entry->data_size(); |
| + } |
| + |
| if (has_text) { |
| memcpy(buf, text_track_entry->data(), |
| text_track_entry->data_size()); |
| @@ -434,16 +426,19 @@ class ChunkDemuxerTest : public ::testing::Test { |
| ChunkDemuxer::Status AddId(const std::string& source_id, int stream_flags) { |
| bool has_audio = (stream_flags & HAS_AUDIO) != 0; |
| bool has_video = (stream_flags & HAS_VIDEO) != 0; |
| - std::vector<std::string> codecs; |
| + std::string codecs; |
| std::string type; |
| if (has_audio) { |
| - codecs.push_back("vorbis"); |
| + codecs += "vorbis"; |
| type = "audio/webm"; |
| } |
| if (has_video) { |
| - codecs.push_back("vp8"); |
| + if (codecs == "") |
| + codecs = "vp8"; |
| + else |
| + codecs += ",vp8"; |
| type = "video/webm"; |
| } |
| @@ -451,28 +446,19 @@ class ChunkDemuxerTest : public ::testing::Test { |
| return AddId(kSourceId, HAS_AUDIO | HAS_VIDEO); |
| } |
| - ChunkDemuxer::Status status = demuxer_->AddId(source_id, type, codecs); |
| - if (status == ChunkDemuxer::kOk) |
| - demuxer_->SetTracksWatcher( |
| - source_id, base::Bind(&ChunkDemuxerTest::InitSegmentReceived, |
| - base::Unretained(this))); |
| - return status; |
| + return AddId(source_id, type, codecs); |
| } |
| -#if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) |
| - ChunkDemuxer::Status AddIdForMp2tSource(const std::string& source_id) { |
| - std::vector<std::string> codecs; |
| - std::string type = "video/mp2t"; |
| - codecs.push_back("mp4a.40.2"); |
| - codecs.push_back("avc1.640028"); |
| - ChunkDemuxer::Status status = demuxer_->AddId(source_id, type, codecs); |
| + ChunkDemuxer::Status AddId(const std::string& source_id, |
| + const std::string& mime_type, |
| + const std::string& codecs) { |
| + ChunkDemuxer::Status status = demuxer_->AddId(source_id, mime_type, codecs); |
| if (status == ChunkDemuxer::kOk) |
| demuxer_->SetTracksWatcher( |
| source_id, base::Bind(&ChunkDemuxerTest::InitSegmentReceived, |
| base::Unretained(this))); |
| return status; |
| } |
| -#endif |
| bool AppendData(const uint8_t* data, size_t length) { |
| return AppendData(kSourceId, data, length); |
| @@ -818,15 +804,14 @@ class ChunkDemuxerTest : public ::testing::Test { |
| } |
| void ExpectInitMediaLogs(int stream_flags) { |
| - if (stream_flags & HAS_AUDIO) { |
| - EXPECT_MEDIA_LOG(FoundStream("audio")); |
| - EXPECT_MEDIA_LOG(CodecName("audio", "vorbis")); |
| - } |
| - |
| if (stream_flags & HAS_VIDEO) { |
| EXPECT_MEDIA_LOG(FoundStream("video")); |
| EXPECT_MEDIA_LOG(CodecName("video", "vp8")); |
| } |
| + if (stream_flags & HAS_AUDIO) { |
| + EXPECT_MEDIA_LOG(FoundStream("audio")); |
| + EXPECT_MEDIA_LOG(CodecName("audio", "vorbis")); |
| + } |
| } |
| bool InitDemuxerWithEncryptionInfo( |
| @@ -864,6 +849,8 @@ class ChunkDemuxerTest : public ::testing::Test { |
| EXPECT_CALL(*this, InitSegmentReceivedMock(_)); |
| } else { |
| // OnNewConfigs() requires at least one audio, video, or text track. |
| + EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("vorbis")); |
| + EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("vp8")); |
| EXPECT_MEDIA_LOG(StreamParsingFailed()); |
| } |
| @@ -2410,16 +2397,14 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithAudioOnlyType) { |
| &host_, CreateInitDoneCB(kNoTimestamp, CHUNK_DEMUXER_ERROR_APPEND_FAILED), |
| true); |
| - std::vector<std::string> codecs(1); |
| - codecs[0] = "vorbis"; |
| - ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", codecs), |
| + ASSERT_EQ(demuxer_->AddId(kSourceId, "audio/webm", "vorbis"), |
| ChunkDemuxer::kOk); |
| demuxer_->SetTracksWatcher(kSourceId, |
| base::Bind(&ChunkDemuxerTest::InitSegmentReceived, |
| base::Unretained(this))); |
| // Video track is unexpected per mimetype. |
| - EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", true)); |
| + EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("Video", "vp8")); |
| EXPECT_MEDIA_LOG(StreamParsingFailed()); |
| ASSERT_FALSE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO)); |
| } |
| @@ -2430,16 +2415,15 @@ TEST_F(ChunkDemuxerTest, AVHeadersWithVideoOnlyType) { |
| &host_, CreateInitDoneCB(kNoTimestamp, CHUNK_DEMUXER_ERROR_APPEND_FAILED), |
| true); |
| - std::vector<std::string> codecs(1); |
| - codecs[0] = "vp8"; |
| - ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), |
| - ChunkDemuxer::kOk); |
| + ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", "vp8"), ChunkDemuxer::kOk); |
| demuxer_->SetTracksWatcher(kSourceId, |
| base::Bind(&ChunkDemuxerTest::InitSegmentReceived, |
| base::Unretained(this))); |
| // Audio track is unexpected per mimetype. |
| - EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", true)); |
| + EXPECT_MEDIA_LOG(FoundStream("video")); |
| + EXPECT_MEDIA_LOG(CodecName("video", "vp8")); |
| + EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("Audio", "vorbis")); |
| EXPECT_MEDIA_LOG(StreamParsingFailed()); |
| ASSERT_FALSE(AppendInitSegment(HAS_AUDIO | HAS_VIDEO)); |
| } |
| @@ -2450,17 +2434,16 @@ TEST_F(ChunkDemuxerTest, AudioOnlyHeaderWithAVType) { |
| &host_, CreateInitDoneCB(kNoTimestamp, CHUNK_DEMUXER_ERROR_APPEND_FAILED), |
| true); |
| - std::vector<std::string> codecs(2); |
| - codecs[0] = "vorbis"; |
| - codecs[1] = "vp8"; |
| - ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), |
| + ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", "vorbis,vp8"), |
| ChunkDemuxer::kOk); |
| demuxer_->SetTracksWatcher(kSourceId, |
| base::Bind(&ChunkDemuxerTest::InitSegmentReceived, |
| base::Unretained(this))); |
| // Video track is also expected per mimetype. |
| - EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("a video", false)); |
| + EXPECT_MEDIA_LOG(FoundStream("audio")); |
| + EXPECT_MEDIA_LOG(CodecName("audio", "vorbis")); |
| + EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("vp8")); |
| EXPECT_MEDIA_LOG(StreamParsingFailed()); |
| ASSERT_FALSE(AppendInitSegment(HAS_AUDIO)); |
| } |
| @@ -2471,17 +2454,16 @@ TEST_F(ChunkDemuxerTest, VideoOnlyHeaderWithAVType) { |
| &host_, CreateInitDoneCB(kNoTimestamp, CHUNK_DEMUXER_ERROR_APPEND_FAILED), |
| true); |
| - std::vector<std::string> codecs(2); |
| - codecs[0] = "vorbis"; |
| - codecs[1] = "vp8"; |
| - ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", codecs), |
| + ASSERT_EQ(demuxer_->AddId(kSourceId, "video/webm", "vorbis,vp8"), |
| ChunkDemuxer::kOk); |
| demuxer_->SetTracksWatcher(kSourceId, |
| base::Bind(&ChunkDemuxerTest::InitSegmentReceived, |
| base::Unretained(this))); |
| // Audio track is also expected per mimetype. |
| - EXPECT_MEDIA_LOG(InitSegmentMismatchesMimeType("an audio", false)); |
| + EXPECT_MEDIA_LOG(FoundStream("video")); |
| + EXPECT_MEDIA_LOG(CodecName("video", "vp8")); |
| + EXPECT_MEDIA_LOG(InitSegmentMissesExpectedTrack("vorbis")); |
| EXPECT_MEDIA_LOG(StreamParsingFailed()); |
| ASSERT_FALSE(AppendInitSegment(HAS_VIDEO)); |
| } |
| @@ -2548,9 +2530,6 @@ TEST_F(ChunkDemuxerTest, AddIdFailures) { |
| ASSERT_EQ(AddId(audio_id, HAS_AUDIO), ChunkDemuxer::kOk); |
| - // Adding an id with audio/video should fail because we already added audio. |
| - ASSERT_EQ(AddId(), ChunkDemuxer::kReachedIdLimit); |
| - |
| ExpectInitMediaLogs(HAS_AUDIO); |
| EXPECT_CALL(*this, InitSegmentReceivedMock(_)); |
| ASSERT_TRUE(AppendInitSegmentWithSourceId(audio_id, HAS_AUDIO)); |
| @@ -2576,12 +2555,16 @@ TEST_F(ChunkDemuxerTest, RemoveId) { |
| // Read() from audio should return normal buffers. |
| GenerateAudioStreamExpectedReads(0, 4); |
| + // Audio stream will become inaccessible after |audio_id| is removed, so save |
| + // it here to read from it after RemoveId. |
| + DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
| + |
| // Remove the audio id. |
| demuxer_->RemoveId(audio_id); |
| // Read() from audio should return "end of stream" buffers. |
| bool audio_read_done = false; |
| - ReadAudio(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); |
| + audio_stream->Read(base::Bind(&OnReadDone_EOSExpected, &audio_read_done)); |
| base::RunLoop().RunUntilIdle(); |
| EXPECT_TRUE(audio_read_done); |
| @@ -3147,10 +3130,7 @@ TEST_F(ChunkDemuxerTest, CodecPrefixMatching) { |
| #endif |
| #endif |
| - std::vector<std::string> codecs; |
| - codecs.push_back("avc1.4D4041"); |
| - |
| - EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", codecs), expected); |
| + EXPECT_EQ(demuxer_->AddId("source_id", "video/mp4", "avc1.4D4041"), expected); |
| } |
| // Test codec ID's that are not compliant with RFC6381, but have been |
| @@ -3168,11 +3148,8 @@ TEST_F(ChunkDemuxerTest, CodecIDsThatAreNotRFC6381Compliant) { |
| }; |
| for (size_t i = 0; i < arraysize(codec_ids); ++i) { |
| - std::vector<std::string> codecs; |
| - codecs.push_back(codec_ids[i]); |
| - |
| ChunkDemuxer::Status result = |
| - demuxer_->AddId("source_id", "audio/mp4", codecs); |
| + demuxer_->AddId("source_id", "audio/mp4", codec_ids[i]); |
| EXPECT_EQ(result, expected) |
| << "Fail to add codec_id '" << codec_ids[i] << "'"; |
| @@ -3474,6 +3451,11 @@ TEST_F(ChunkDemuxerTest, IsParsingMediaSegmentMidMediaSegment) { |
| #if defined(USE_PROPRIETARY_CODECS) |
| #if BUILDFLAG(ENABLE_MSE_MPEG2TS_STREAM_PARSER) |
| +namespace { |
| +const char* kMp2tMimeType = "video/mp2t"; |
| +const char* kMp2tCodecs = "mp4a.40.2,avc1.640028"; |
| +} |
| + |
| TEST_F(ChunkDemuxerTest, EmitBuffersDuringAbort) { |
| EXPECT_CALL(*this, DemuxerOpened()); |
| EXPECT_MEDIA_LOG(FoundStream("audio")); |
| @@ -3482,7 +3464,7 @@ TEST_F(ChunkDemuxerTest, EmitBuffersDuringAbort) { |
| EXPECT_MEDIA_LOG(CodecName("video", "h264")); |
| demuxer_->Initialize(&host_, CreateInitDoneCB(kInfiniteDuration, PIPELINE_OK), |
| true); |
| - EXPECT_EQ(ChunkDemuxer::kOk, AddIdForMp2tSource(kSourceId)); |
| + EXPECT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, kMp2tMimeType, kMp2tCodecs)); |
|
wolenetz
2016/09/13 21:03:13
aside: nice elimination of that helper, above.
servolk
2016/09/14 18:15:24
Acknowledged.
|
| // For info: |
| // DTS/PTS derived using dvbsnoop -s ts -if bear-1280x720.ts -tssubdecode |
| @@ -3530,7 +3512,7 @@ TEST_F(ChunkDemuxerTest, SeekCompleteDuringAbort) { |
| EXPECT_MEDIA_LOG(CodecName("video", "h264")); |
| demuxer_->Initialize(&host_, CreateInitDoneCB(kInfiniteDuration, PIPELINE_OK), |
| true); |
| - EXPECT_EQ(ChunkDemuxer::kOk, AddIdForMp2tSource(kSourceId)); |
| + EXPECT_EQ(ChunkDemuxer::kOk, AddId(kSourceId, kMp2tMimeType, kMp2tCodecs)); |
| // For info: |
| // DTS/PTS derived using dvbsnoop -s ts -if bear-1280x720.ts -tssubdecode |
| @@ -4454,48 +4436,36 @@ TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) { |
| 80)); |
| Seek(base::TimeDelta::FromMilliseconds(0)); |
| - // Audio stream had 8 buffers, video stream had 15. We told EvictCodedFrames |
|
wolenetz
2016/09/13 21:03:13
Why is this portion of this test dropped?
servolk
2016/09/14 18:15:24
This logic got broken when I temporarily switched
|
| - // that the new data size is 8 blocks muxed, i.e. 80 bytes. Given the current |
| - // ratio of video to the total data size (15 : (8+15) ~= 0.65) the estimated |
| - // sizes of video and audio data in the new 80 byte chunk are 52 bytes for |
| - // video (80*0.65 = 52) and 28 bytes for audio (80 - 52). |
| - // Given these numbers MSE GC will remove just one audio block (since current |
| - // audio size is 80 bytes, new data is 28 bytes, we need to remove just one 10 |
| - // byte block to stay under 100 bytes memory limit after append |
| - // 80 - 10 + 28 = 98). |
| - // For video stream 150 + 52 = 202. Video limit is 150 bytes. We need to |
| - // remove at least 6 blocks to stay under limit. |
| - CheckExpectedBuffers(audio_stream, "40K 80K 120K 160K 200K 240K 280K"); |
| - 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")); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("2")); |
| ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0))); |
| } |
| TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_VideoOnly) { |
| ASSERT_TRUE(InitDemuxer(HAS_VIDEO)); |
| - EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("1")); |
| ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0))); |
| } |
| TEST_F(ChunkDemuxerTest, SegmentMissingAudioFrame_AudioVideo) { |
| ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| - EXPECT_MEDIA_LOG(SegmentMissingFrames("audio")); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("2")); |
| AppendSingleStreamCluster(kSourceId, kVideoTrackNum, 0, 10); |
| } |
| TEST_F(ChunkDemuxerTest, SegmentMissingVideoFrame_AudioVideo) { |
| ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| - EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("1")); |
| AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10); |
| } |
| TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) { |
| ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); |
| - EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video")); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("1")); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("2")); |
| ASSERT_TRUE(AppendCluster(GenerateEmptyCluster(0))); |
| } |
| @@ -4629,7 +4599,7 @@ TEST_F(ChunkDemuxerTest, |
| DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO); |
| DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO); |
| - EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("1")); |
| AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 10K 20D10K"), |
| MuxedStreamInfo(kVideoTrackNum, "")); |
| demuxer_->Remove(kSourceId, base::TimeDelta(), |
| @@ -4744,4 +4714,80 @@ TEST_F(ChunkDemuxerTest, StreamStatusNotifications) { |
| CheckStreamStatusNotifications(video_stream); |
| } |
| +TEST_F(ChunkDemuxerTest, MultipleIds) { |
| + CreateNewDemuxer(); |
| + EXPECT_CALL(*this, DemuxerOpened()); |
| + EXPECT_CALL(host_, SetDuration(_)).Times(2); |
| + demuxer_->Initialize(&host_, CreateInitDoneCB(kNoTimestamp, PIPELINE_OK), |
| + true); |
| + |
| + const char* kId1 = "id1"; |
| + const char* kId2 = "id2"; |
| + EXPECT_EQ(AddId(kId1, "video/webm", "opus,vp9"), ChunkDemuxer::kOk); |
| + EXPECT_EQ(AddId(kId2, "video/webm", "opus,vp9"), ChunkDemuxer::kOk); |
| + scoped_refptr<DecoderBuffer> data1 = ReadTestDataFile("green-a300hz.webm"); |
| + scoped_refptr<DecoderBuffer> data2 = ReadTestDataFile("red-a500hz.webm"); |
| + |
| + EXPECT_MEDIA_LOG(FoundStream("audio")).Times(2); |
| + EXPECT_MEDIA_LOG(FoundStream("video")).Times(2); |
| + EXPECT_MEDIA_LOG(CodecName("audio", "opus")).Times(2); |
| + EXPECT_MEDIA_LOG(CodecName("video", "vp9")).Times(2); |
| + EXPECT_CALL(*this, InitSegmentReceivedMock(_)).Times(2); |
| + EXPECT_MEDIA_LOG(SegmentMissingFrames("1")).Times(AnyNumber()); |
|
wolenetz
2016/09/13 21:03:13
Is this because the test media indeed has muxed se
servolk
2016/09/14 18:15:25
Yes, if I remove this then the test fails due to u
wolenetz
2016/09/14 23:31:21
The binary files used by this test don't apply whe
servolk
2016/09/15 00:18:32
Done.
wolenetz
2016/09/15 01:00:08
Thank you. The files look ok. Specifically, "red-a
servolk
2016/09/15 02:13:07
Done.
|
| + |
| + EXPECT_TRUE(AppendData(kId1, data1->data(), data1->data_size())); |
| + EXPECT_TRUE(AppendData(kId2, data2->data(), data2->data_size())); |
| + CheckExpectedRanges(kId1, "{ [0,10007) }"); |
| + CheckExpectedRanges(kId2, "{ [0,10007) }"); |
|
wolenetz
2016/09/13 21:03:13
nit: might be a slightly better test if the two so
servolk
2016/09/14 18:15:24
Done.
|
| +} |
| + |
| +TEST_F(ChunkDemuxerTest, CompleteInitAfterIdRemoved) { |
| + CreateNewDemuxer(); |
| + EXPECT_CALL(*this, DemuxerOpened()); |
| + demuxer_->Initialize(&host_, |
| + CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
| + |
| + // Add two ids, then remove one of the ids and verify that adding data only |
|
wolenetz
2016/09/13 21:03:13
nit: s/data/init segment/
servolk
2016/09/14 18:15:24
Done.
|
| + // for the remaining id still triggers the InitDoneCB. |
| + const char* kId1 = "id1"; |
| + const char* kId2 = "id2"; |
| + EXPECT_EQ(AddId(kId1, "video/webm", "vp8"), ChunkDemuxer::kOk); |
| + EXPECT_EQ(AddId(kId2, "video/webm", "vp9"), ChunkDemuxer::kOk); |
| + demuxer_->RemoveId(kId2); |
| + |
| + EXPECT_CALL(*this, InitSegmentReceivedMock(_)); |
| + EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(30)); |
|
wolenetz
2016/09/13 21:03:13
nit ditto of below.
servolk
2016/09/14 18:15:25
Acknowledged.
|
| + EXPECT_MEDIA_LOG(FoundStream("video")); |
| + EXPECT_MEDIA_LOG(CodecName("video", "vp8")); |
| + |
| + ASSERT_TRUE(AppendInitSegmentWithSourceId(kId1, HAS_VIDEO)); |
| + AppendSingleStreamCluster(kId1, kVideoTrackNum, "0K 30 60 90"); |
|
wolenetz
2016/09/13 21:03:13
nit: this line should not be necessary to trigger
servolk
2016/09/14 18:15:25
I agree this is not strictly necessary, so I can r
wolenetz
2016/09/14 23:31:21
I'm fine with keeping it.
servolk
2016/09/15 00:18:32
Acknowledged.
|
| +} |
| + |
| +TEST_F(ChunkDemuxerTest, RemovingIdMustRemoveStreams) { |
| + CreateNewDemuxer(); |
| + EXPECT_CALL(*this, DemuxerOpened()); |
| + demuxer_->Initialize(&host_, |
| + CreateInitDoneCB(kDefaultDuration(), PIPELINE_OK), true); |
| + |
| + const char* kId1 = "id1"; |
| + EXPECT_EQ(AddId(kId1, "video/webm", "vorbis,vp8"), ChunkDemuxer::kOk); |
| + |
| + EXPECT_CALL(*this, InitSegmentReceivedMock(_)); |
| + EXPECT_MEDIA_LOG(FoundStream("video")); |
| + EXPECT_MEDIA_LOG(CodecName("video", "vp8")); |
| + EXPECT_MEDIA_LOG(FoundStream("audio")); |
| + EXPECT_MEDIA_LOG(CodecName("audio", "vorbis")); |
| + |
| + // Append init segment to ensure demuxer streams get created. |
| + ASSERT_TRUE(AppendInitSegmentWithSourceId(kId1, HAS_AUDIO | HAS_VIDEO)); |
| + EXPECT_NE(nullptr, demuxer_->GetStream(DemuxerStream::AUDIO)); |
| + EXPECT_NE(nullptr, demuxer_->GetStream(DemuxerStream::VIDEO)); |
| + |
| + // Removing the id should remove also the DemuxerStreams. |
| + demuxer_->RemoveId(kId1); |
| + EXPECT_EQ(nullptr, demuxer_->GetStream(DemuxerStream::AUDIO)); |
| + EXPECT_EQ(nullptr, demuxer_->GetStream(DemuxerStream::VIDEO)); |
| +} |
| + |
| } // namespace media |