Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(826)

Side by Side Diff: media/filters/chunk_demuxer_unittest.cc

Issue 1670033002: Reland: MSE: Relax the 'media segment must begin with keyframe' requirement (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: More tests for item #7 in CL description Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/filters/chunk_demuxer.h" 5 #include "media/filters/chunk_demuxer.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 #include <algorithm> 9 #include <algorithm>
10 #include <utility> 10 #include <utility>
(...skipping 667 matching lines...) Expand 10 before | Expand all | Expand 10 after
678 void AppendMuxedCluster(const MuxedStreamInfo& msi_1, 678 void AppendMuxedCluster(const MuxedStreamInfo& msi_1,
679 const MuxedStreamInfo& msi_2, 679 const MuxedStreamInfo& msi_2,
680 const MuxedStreamInfo& msi_3) { 680 const MuxedStreamInfo& msi_3) {
681 std::vector<MuxedStreamInfo> msi(3); 681 std::vector<MuxedStreamInfo> msi(3);
682 msi[0] = msi_1; 682 msi[0] = msi_1;
683 msi[1] = msi_2; 683 msi[1] = msi_2;
684 msi[2] = msi_3; 684 msi[2] = msi_3;
685 AppendMuxedCluster(msi); 685 AppendMuxedCluster(msi);
686 } 686 }
687 687
688 void AppendMuxedCluster(const std::vector<MuxedStreamInfo> msi) { 688 scoped_ptr<Cluster> GenerateMuxedCluster(
689 const std::vector<MuxedStreamInfo> msi) {
689 std::priority_queue<BlockInfo> block_queue; 690 std::priority_queue<BlockInfo> block_queue;
690 for (size_t i = 0; i < msi.size(); ++i) { 691 for (size_t i = 0; i < msi.size(); ++i) {
691 std::vector<BlockInfo> track_blocks; 692 std::vector<BlockInfo> track_blocks;
692 ParseBlockDescriptions(msi[i].track_number, msi[i].block_descriptions, 693 ParseBlockDescriptions(msi[i].track_number, msi[i].block_descriptions,
693 &track_blocks); 694 &track_blocks);
694 695
695 for (size_t j = 0; j < track_blocks.size(); ++j) { 696 for (size_t j = 0; j < track_blocks.size(); ++j) {
696 block_queue.push(track_blocks[j]); 697 block_queue.push(track_blocks[j]);
697 } 698 }
698 699
699 if (msi[i].last_blocks_estimated_duration != -1) { 700 if (msi[i].last_blocks_estimated_duration != -1) {
700 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated( 701 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
701 msi[i].last_blocks_estimated_duration)); 702 msi[i].last_blocks_estimated_duration));
702 } 703 }
703 } 704 }
705 return GenerateCluster(block_queue, false);
706 }
704 707
705 AppendCluster(kSourceId, GenerateCluster(block_queue, false)); 708 void AppendMuxedCluster(const std::vector<MuxedStreamInfo> msi) {
709 AppendCluster(kSourceId, GenerateMuxedCluster(msi));
706 } 710 }
707 711
708 void AppendData(const std::string& source_id, 712 void AppendData(const std::string& source_id,
709 const uint8_t* data, 713 const uint8_t* data,
710 size_t length) { 714 size_t length) {
711 EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber()); 715 EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber());
712 716
713 demuxer_->AppendData(source_id, data, length, 717 demuxer_->AppendData(source_id, data, length,
714 append_window_start_for_next_append_, 718 append_window_start_for_next_append_,
715 append_window_end_for_next_append_, 719 append_window_end_for_next_append_,
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after
895 899
896 // Initializes the demuxer with data from 2 files with different 900 // Initializes the demuxer with data from 2 files with different
897 // decoder configurations. This is used to test the decoder config change 901 // decoder configurations. This is used to test the decoder config change
898 // logic. 902 // logic.
899 // 903 //
900 // bear-320x240.webm VideoDecoderConfig returns 320x240 for its natural_size() 904 // bear-320x240.webm VideoDecoderConfig returns 320x240 for its natural_size()
901 // bear-640x360.webm VideoDecoderConfig returns 640x360 for its natural_size() 905 // bear-640x360.webm VideoDecoderConfig returns 640x360 for its natural_size()
902 // The resulting video stream returns data from each file for the following 906 // The resulting video stream returns data from each file for the following
903 // time ranges. 907 // time ranges.
904 // bear-320x240.webm : [0-501) [801-2736) 908 // bear-320x240.webm : [0-501) [801-2736)
905 // bear-640x360.webm : [527-793) 909 // bear-640x360.webm : [527-760)
wolenetz 2016/02/12 01:23:47 This is intentional. As of patch set 4-5, the remo
wolenetz 2016/02/24 00:34:46 Note this earlier comment was meant to help explai
chcunningham 2016/02/24 19:06:26 Acknowledged.
906 // 910 //
907 // bear-320x240.webm AudioDecoderConfig returns 3863 for its extra_data size. 911 // bear-320x240.webm AudioDecoderConfig returns 3863 for its extra_data size.
908 // bear-640x360.webm AudioDecoderConfig returns 3935 for its extra_data size. 912 // bear-640x360.webm AudioDecoderConfig returns 3935 for its extra_data size.
909 // The resulting audio stream returns data from each file for the following 913 // The resulting audio stream returns data from each file for the following
910 // time ranges. 914 // time ranges.
911 // bear-320x240.webm : [0-524) [779-2736) 915 // bear-320x240.webm : [0-524) [779-2736)
912 // bear-640x360.webm : [527-759) 916 // bear-640x360.webm : [527-759)
913 bool InitDemuxerWithConfigChangeData() { 917 bool InitDemuxerWithConfigChangeData() {
914 scoped_refptr<DecoderBuffer> bear1 = ReadTestDataFile("bear-320x240.webm"); 918 scoped_refptr<DecoderBuffer> bear1 = ReadTestDataFile("bear-320x240.webm");
915 scoped_refptr<DecoderBuffer> bear2 = ReadTestDataFile("bear-640x360.webm"); 919 scoped_refptr<DecoderBuffer> bear2 = ReadTestDataFile("bear-640x360.webm");
(...skipping 2278 matching lines...) Expand 10 before | Expand all | Expand 10 after
3194 const VideoDecoderConfig& video_config_2 = video->video_decoder_config(); 3198 const VideoDecoderConfig& video_config_2 = video->video_decoder_config();
3195 ASSERT_TRUE(video_config_2.IsValidConfig()); 3199 ASSERT_TRUE(video_config_2.IsValidConfig());
3196 EXPECT_EQ(video_config_2.natural_size().width(), 640); 3200 EXPECT_EQ(video_config_2.natural_size().width(), 640);
3197 EXPECT_EQ(video_config_2.natural_size().height(), 360); 3201 EXPECT_EQ(video_config_2.natural_size().height(), 360);
3198 3202
3199 ExpectRead(DemuxerStream::VIDEO, 527); 3203 ExpectRead(DemuxerStream::VIDEO, 527);
3200 3204
3201 // Read until the next config change. 3205 // Read until the next config change.
3202 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 3206 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
3203 ASSERT_EQ(status, DemuxerStream::kConfigChanged); 3207 ASSERT_EQ(status, DemuxerStream::kConfigChanged);
3204 EXPECT_EQ(last_timestamp.InMilliseconds(), 793); 3208 EXPECT_EQ(last_timestamp.InMilliseconds(), 760);
3205 3209
3206 // Get the new config and verify that it matches the first one. 3210 // Get the new config and verify that it matches the first one.
3207 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config())); 3211 ASSERT_TRUE(video_config_1.Matches(video->video_decoder_config()));
3208 3212
3209 ExpectRead(DemuxerStream::VIDEO, 801); 3213 ExpectRead(DemuxerStream::VIDEO, 801);
3210 3214
3211 // Read until the end of the stream just to make sure there aren't any other 3215 // Read until the end of the stream just to make sure there aren't any other
3212 // config changes. 3216 // config changes.
3213 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp); 3217 ReadUntilNotOkOrEndOfStream(DemuxerStream::VIDEO, &status, &last_timestamp);
3214 ASSERT_EQ(status, DemuxerStream::kOk); 3218 ASSERT_EQ(status, DemuxerStream::kOk);
(...skipping 1179 matching lines...) Expand 10 before | Expand all | Expand 10 after
4394 EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); 4398 EXPECT_MEDIA_LOG(SegmentMissingFrames("video"));
4395 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10); 4399 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
4396 } 4400 }
4397 4401
4398 TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) { 4402 TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) {
4399 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4403 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4400 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video")); 4404 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video"));
4401 AppendCluster(GenerateEmptyCluster(0)); 4405 AppendCluster(GenerateEmptyCluster(0));
4402 } 4406 }
4403 4407
4408 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_FirstSegmentMissingKeyframe) {
4409 // Append V:[n n n][n n K]
4410 // Expect V: [K]
4411 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4412 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4413
4414 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2);
4415 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0 10 20");
4416 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50K");
4417 CheckExpectedRanges("{ [50,60) }");
4418 CheckExpectedBuffers(video_stream, "50K");
4419 }
4420
4421 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_SecondSegmentMissingKeyframe) {
4422 // Append V:[K n n][n n n]
4423 // Expect V:[K n n][n n n]
4424 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4425 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4426
4427 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(2);
4428 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
4429 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
4430 CheckExpectedRanges("{ [0,60) }");
4431 CheckExpectedBuffers(video_stream, "0K 10 20 30 40 50");
4432 }
4433
4434 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_1) {
4435 // Append V:[K n n]
4436 // Remove *****
4437 // Append V: [n n n][n K n]
4438 // Expect: [K n]
4439 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4440 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4441
4442 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3);
4443 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
4444 demuxer_->Remove(kSourceId, base::TimeDelta(),
4445 base::TimeDelta::FromMilliseconds(30));
4446 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
4447 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80");
4448 CheckExpectedRanges("{ [70,90) }");
4449 CheckExpectedBuffers(video_stream, "70K 80");
4450 }
4451
4452 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_2) {
4453 // Append V:[K n n][n n n][n K n]
4454 // Remove *
4455 // Expect: [K n]
4456 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4457 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4458
4459 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3);
4460 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
4461 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
4462 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80");
4463 demuxer_->Remove(kSourceId, base::TimeDelta(),
4464 base::TimeDelta::FromMilliseconds(10));
4465 CheckExpectedRanges("{ [70,90) }");
4466 CheckExpectedBuffers(video_stream, "70K 80");
4467 }
4468
4469 TEST_F(ChunkDemuxerTest, RelaxedKeyframe_RemoveInterruptsCodedFrameGroup_3) {
4470 // Append V:[K n n][n n n][n K n]
4471 // Remove *
4472 // Expect: [K n n..n n] [K n]
4473 ASSERT_TRUE(InitDemuxer(HAS_VIDEO));
4474 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4475
4476 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(10)).Times(3);
4477 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "0K 10 20");
4478 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "30 40 50");
4479 AppendSingleStreamCluster(kSourceId, kVideoTrackNum, "60 70K 80");
4480 demuxer_->Remove(kSourceId, base::TimeDelta::FromMilliseconds(50),
4481 base::TimeDelta::FromMilliseconds(60));
4482 CheckExpectedRanges("{ [0,50) [70,90) }");
4483 CheckExpectedBuffers(video_stream, "0K 10 20 30 40");
4484 Seek(base::TimeDelta::FromMilliseconds(70));
4485 CheckExpectedBuffers(video_stream, "70K 80");
4486 }
4487
4488 TEST_F(ChunkDemuxerTest,
4489 RelaxedKeyframe_RemoveInterruptsMuxedCodedFrameGroup_1) {
4490 // Append muxed:
4491 // A:[K K K]
4492 // V:[K n n]
4493 // Remove *****
4494 // Append muxed:
4495 // A: [K K K][K K K]
4496 // V: [n n n][n K n]
4497 // Expect:
4498 // A: [K K K][K K K]
4499 // V [K n]
4500 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4501 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
4502 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4503
4504 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 10K 20D10K"),
4505 MuxedStreamInfo(kVideoTrackNum, "0K 10 20", 10));
4506 demuxer_->Remove(kSourceId, base::TimeDelta(),
4507 base::TimeDelta::FromMilliseconds(30));
4508 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "30K 40K 50D10K"),
4509 MuxedStreamInfo(kVideoTrackNum, "30 40 50", 10));
4510 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "60K 70K 80D10K"),
4511 MuxedStreamInfo(kVideoTrackNum, "60 70K 80", 10));
4512 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }");
4513 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [70,90) }");
4514 CheckExpectedRanges("{ [70,90) }");
4515 CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K");
4516 CheckExpectedBuffers(video_stream, "70K 80");
4517 }
4518
4519 TEST_F(ChunkDemuxerTest,
4520 RelaxedKeyframe_RemoveInterruptsMuxedCodedFrameGroup_2) {
4521 // Append muxed:
4522 // A:[K K K]
4523 // V:(Nothing, simulating jagged cluster start or a long previous
4524 // video frame)
4525 // Remove *****
4526 // Append muxed:
4527 // A: [K K K][K K K]
4528 // V: [n n n][n K n]
4529 // Expect:
4530 // A: [K K K][K K K]
4531 // V [................K n] (As would occur if there really were a
4532 // jagged cluster start and not badly muxed clusters as used to
4533 // simulate a jagged start in this test.)
4534 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4535 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
4536 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4537
4538 EXPECT_MEDIA_LOG(SegmentMissingFrames("video"));
4539 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "0K 10K 20D10K"),
4540 MuxedStreamInfo(kVideoTrackNum, ""));
4541 demuxer_->Remove(kSourceId, base::TimeDelta(),
4542 base::TimeDelta::FromMilliseconds(30));
4543 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "30K 40K 50D10K"),
4544 MuxedStreamInfo(kVideoTrackNum, "30 40 50", 10));
4545 AppendMuxedCluster(MuxedStreamInfo(kAudioTrackNum, "60K 70K 80D10K"),
4546 MuxedStreamInfo(kVideoTrackNum, "60 70K 80", 10));
4547 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }");
4548 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,90) }");
4549 CheckExpectedRanges("{ [30,90) }");
4550 CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K");
4551 CheckExpectedBuffers(video_stream, "70K 80");
4552 }
4553
4554 TEST_F(ChunkDemuxerTest,
4555 RelaxedKeyframe_RemoveInterruptsMuxedCodedFrameGroup_3) {
4556 // Append muxed:
4557 // A:[K K K
4558 // V:(Nothing yet. This is a jagged start, not simulated.)
4559 // Remove *****
4560 // Append muxed:
4561 // A: K K K K K K]
4562 // V: n n n n K n]
4563 // Expect:
4564 // A: [K K K K K K]
4565 // V [..............K n]
4566 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4567 DemuxerStream* audio_stream = demuxer_->GetStream(DemuxerStream::AUDIO);
4568 DemuxerStream* video_stream = demuxer_->GetStream(DemuxerStream::VIDEO);
4569
4570 std::vector<MuxedStreamInfo> msi(2);
4571 msi[0] =
4572 MuxedStreamInfo(kAudioTrackNum, "0K 10K 20K 30K 40K 50K 60K 70K 80D10K");
4573 msi[1] = MuxedStreamInfo(kVideoTrackNum, "31 41 51 61 71K 81", 10);
4574 scoped_ptr<Cluster> cluster = GenerateMuxedCluster(msi);
4575
4576 // Append the first part of the cluster, up to the beginning of the first
4577 // video simpleblock. The result should be just 4 audio blocks and no video
4578 // blocks are appended. Since the stream parser does not yet have a duration
4579 // for the 4th audio block in this partial cluster append, it is not yet
4580 // emitted from the parser, and only the first 3 audio blocks are expected to
4581 // be buffered by and available from the demuxer.
4582 ASSERT_EQ(kVideoTrackNum, 1);
4583 int video_start = 0;
4584 bool found = false;
4585 while (video_start < cluster->size() - 10) {
4586 if (cluster->data()[video_start] == 0xA3 &&
4587 cluster->data()[video_start + 9] == 0x81) {
4588 found = true;
4589 break;
4590 }
4591 video_start++;
4592 }
4593
4594 ASSERT_TRUE(found);
4595 ASSERT_GT(video_start, 0);
4596 ASSERT_LT(video_start, cluster->size() - 3);
4597
4598 AppendData(kSourceId, cluster->data(), video_start);
4599 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [0,30) }");
4600 CheckExpectedRanges(DemuxerStream::VIDEO, "{ }");
4601
4602 demuxer_->Remove(kSourceId, base::TimeDelta(),
4603 base::TimeDelta::FromMilliseconds(30));
4604
4605 // Append the remainder of the cluster
4606 AppendData(kSourceId, cluster->data() + video_start,
4607 cluster->size() - video_start);
4608
4609 CheckExpectedRanges(DemuxerStream::AUDIO, "{ [30,90) }");
4610 CheckExpectedRanges(DemuxerStream::VIDEO, "{ [0,91) }");
4611 CheckExpectedRanges("{ [30,90) }");
4612 CheckExpectedBuffers(audio_stream, "30K 40K 50K 60K 70K 80K");
4613 CheckExpectedBuffers(video_stream, "71K 81");
4614 }
4615
4404 } // namespace media 4616 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698