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

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

Issue 1637213002: Revert of MSE: Relax the 'media segment must begin with keyframe' requirement (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 11 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
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/filters/frame_processor.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 scoped_ptr<Cluster> GenerateMuxedCluster( 688 void AppendMuxedCluster(const std::vector<MuxedStreamInfo> msi) {
689 const std::vector<MuxedStreamInfo> msi) {
690 std::priority_queue<BlockInfo> block_queue; 689 std::priority_queue<BlockInfo> block_queue;
691 for (size_t i = 0; i < msi.size(); ++i) { 690 for (size_t i = 0; i < msi.size(); ++i) {
692 std::vector<BlockInfo> track_blocks; 691 std::vector<BlockInfo> track_blocks;
693 ParseBlockDescriptions(msi[i].track_number, msi[i].block_descriptions, 692 ParseBlockDescriptions(msi[i].track_number, msi[i].block_descriptions,
694 &track_blocks); 693 &track_blocks);
695 694
696 for (size_t j = 0; j < track_blocks.size(); ++j) { 695 for (size_t j = 0; j < track_blocks.size(); ++j) {
697 block_queue.push(track_blocks[j]); 696 block_queue.push(track_blocks[j]);
698 } 697 }
699 698
700 if (msi[i].last_blocks_estimated_duration != -1) { 699 if (msi[i].last_blocks_estimated_duration != -1) {
701 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated( 700 EXPECT_MEDIA_LOG(WebMSimpleBlockDurationEstimated(
702 msi[i].last_blocks_estimated_duration)); 701 msi[i].last_blocks_estimated_duration));
703 } 702 }
704 } 703 }
705 return GenerateCluster(block_queue, false);
706 }
707 704
708 void AppendMuxedCluster(const std::vector<MuxedStreamInfo> msi) { 705 AppendCluster(kSourceId, GenerateCluster(block_queue, false));
709 AppendCluster(kSourceId, GenerateMuxedCluster(msi));
710 } 706 }
711 707
712 void AppendData(const std::string& source_id, 708 void AppendData(const std::string& source_id,
713 const uint8_t* data, 709 const uint8_t* data,
714 size_t length) { 710 size_t length) {
715 EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber()); 711 EXPECT_CALL(host_, OnBufferedTimeRangesChanged(_)).Times(AnyNumber());
716 712
717 demuxer_->AppendData(source_id, data, length, 713 demuxer_->AppendData(source_id, data, length,
718 append_window_start_for_next_append_, 714 append_window_start_for_next_append_,
719 append_window_end_for_next_append_, 715 append_window_end_for_next_append_,
(...skipping 3678 matching lines...) Expand 10 before | Expand all | Expand 10 after
4398 EXPECT_MEDIA_LOG(SegmentMissingFrames("video")); 4394 EXPECT_MEDIA_LOG(SegmentMissingFrames("video"));
4399 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10); 4395 AppendSingleStreamCluster(kSourceId, kAudioTrackNum, 0, 10);
4400 } 4396 }
4401 4397
4402 TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) { 4398 TEST_F(ChunkDemuxerTest, SegmentMissingAudioVideoFrames) {
4403 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO)); 4399 ASSERT_TRUE(InitDemuxer(HAS_AUDIO | HAS_VIDEO));
4404 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video")); 4400 EXPECT_MEDIA_LOG(SegmentMissingFrames("audio or video"));
4405 AppendCluster(GenerateEmptyCluster(0)); 4401 AppendCluster(GenerateEmptyCluster(0));
4406 } 4402 }
4407 4403
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
4616 } // namespace media 4404 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/chunk_demuxer.cc ('k') | media/filters/frame_processor.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698