| 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..21d8e75c73fa42a5e0c8573c7da64ac66abbed31 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());
|
| + 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));
|
| @@ -3147,10 +3126,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 +3144,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 +3447,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 +3460,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));
|
|
|
| // For info:
|
| // DTS/PTS derived using dvbsnoop -s ts -if bear-1280x720.ts -tssubdecode
|
| @@ -3530,7 +3508,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 +4432,36 @@ TEST_F(ChunkDemuxerTest, EvictCodedFramesTest) {
|
| 80));
|
|
|
| Seek(base::TimeDelta::FromMilliseconds(0));
|
| - // Audio stream had 8 buffers, video stream had 15. We told EvictCodedFrames
|
| - // 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 +4595,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 +4710,31 @@ 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());
|
| +
|
| + 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) }");
|
| +}
|
| +
|
| } // namespace media
|
|
|