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

Side by Side Diff: media/renderers/video_renderer_impl_unittest.cc

Issue 1978973002: Moves video frame callbacks from VideoFrameCompositor to Renderer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: addresses comments Created 4 years, 7 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/renderers/video_renderer_impl.cc ('k') | media/test/pipeline_integration_test_base.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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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 <stdint.h> 5 #include <stdint.h>
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
158 // 158 //
159 // Examples: 159 // Examples:
160 // A clip that is four frames long: "0 10 20 30" 160 // A clip that is four frames long: "0 10 20 30"
161 // A clip that has a decode error: "60 70 error" 161 // A clip that has a decode error: "60 70 error"
162 void QueueFrames(const std::string& str) { 162 void QueueFrames(const std::string& str) {
163 for (const std::string& token : 163 for (const std::string& token :
164 base::SplitString(str, " ", base::TRIM_WHITESPACE, 164 base::SplitString(str, " ", base::TRIM_WHITESPACE,
165 base::SPLIT_WANT_ALL)) { 165 base::SPLIT_WANT_ALL)) {
166 if (token == "abort") { 166 if (token == "abort") {
167 scoped_refptr<VideoFrame> null_frame; 167 scoped_refptr<VideoFrame> null_frame;
168 decode_results_.push_back( 168 QueueFrame(DecodeStatus::ABORTED, null_frame);
169 std::make_pair(DecodeStatus::ABORTED, null_frame));
170 continue; 169 continue;
171 } 170 }
172 171
173 if (token == "error") { 172 if (token == "error") {
174 scoped_refptr<VideoFrame> null_frame; 173 scoped_refptr<VideoFrame> null_frame;
175 decode_results_.push_back( 174 QueueFrame(DecodeStatus::DECODE_ERROR, null_frame);
176 std::make_pair(DecodeStatus::DECODE_ERROR, null_frame));
177 continue; 175 continue;
178 } 176 }
179 177
180 int timestamp_in_ms = 0; 178 int timestamp_in_ms = 0;
181 if (base::StringToInt(token, &timestamp_in_ms)) { 179 if (base::StringToInt(token, &timestamp_in_ms)) {
182 gfx::Size natural_size = TestVideoConfig::NormalCodedSize(); 180 gfx::Size natural_size = TestVideoConfig::NormalCodedSize();
183 scoped_refptr<VideoFrame> frame = VideoFrame::CreateFrame( 181 scoped_refptr<VideoFrame> frame = VideoFrame::CreateFrame(
184 PIXEL_FORMAT_YV12, natural_size, gfx::Rect(natural_size), 182 PIXEL_FORMAT_YV12, natural_size, gfx::Rect(natural_size),
185 natural_size, base::TimeDelta::FromMilliseconds(timestamp_in_ms)); 183 natural_size, base::TimeDelta::FromMilliseconds(timestamp_in_ms));
186 decode_results_.push_back(std::make_pair(DecodeStatus::OK, frame)); 184 QueueFrame(DecodeStatus::OK, frame);
187 continue; 185 continue;
188 } 186 }
189 187
190 CHECK(false) << "Unrecognized decoder buffer token: " << token; 188 CHECK(false) << "Unrecognized decoder buffer token: " << token;
191 } 189 }
192 } 190 }
193 191
192 // Queues video frames to be served by the decoder during rendering.
193 void QueueFrame(DecodeStatus status, scoped_refptr<VideoFrame> frame) {
194 decode_results_.push_back(std::make_pair(status, frame));
195 }
196
194 bool IsReadPending() { 197 bool IsReadPending() {
195 return !decode_cb_.is_null(); 198 return !decode_cb_.is_null();
196 } 199 }
197 200
198 void WaitForError(PipelineStatus expected) { 201 void WaitForError(PipelineStatus expected) {
199 SCOPED_TRACE(base::StringPrintf("WaitForError(%d)", expected)); 202 SCOPED_TRACE(base::StringPrintf("WaitForError(%d)", expected));
200 203
201 WaitableMessageLoopEvent event; 204 WaitableMessageLoopEvent event;
202 PipelineStatusCB error_cb = event.GetPipelineStatusCB(); 205 PipelineStatusCB error_cb = event.GetPipelineStatusCB();
203 EXPECT_CALL(mock_cb_, OnError(_)) 206 EXPECT_CALL(mock_cb_, OnError(_))
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
288 ON_CALL(*decoder_, CanReadWithoutStalling()).WillByDefault(Return(false)); 291 ON_CALL(*decoder_, CanReadWithoutStalling()).WillByDefault(Return(false));
289 292
290 QueueFrames("0 30 60 90"); 293 QueueFrames("0 30 60 90");
291 294
292 { 295 {
293 WaitableMessageLoopEvent event; 296 WaitableMessageLoopEvent event;
294 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 297 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
295 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)) 298 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH))
296 .WillOnce(RunClosure(event.GetClosure())); 299 .WillOnce(RunClosure(event.GetClosure()));
297 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 300 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
301 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
302 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
298 StartPlayingFrom(0); 303 StartPlayingFrom(0);
299 event.RunAndWait(); 304 event.RunAndWait();
300 Mock::VerifyAndClearExpectations(&mock_cb_); 305 Mock::VerifyAndClearExpectations(&mock_cb_);
301 } 306 }
302 307
303 renderer_->OnTimeStateChanged(true); 308 renderer_->OnTimeStateChanged(true);
304 309
305 // Advance time slightly, but enough to exceed the duration of the last 310 // Advance time slightly, but enough to exceed the duration of the last
306 // frame. 311 // frame.
307 // Frames should be dropped and we should NOT signal having nothing. 312 // Frames should be dropped and we should NOT signal having nothing.
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 if (type == UnderflowTestType::CANT_READ_WITHOUT_STALLING) 365 if (type == UnderflowTestType::CANT_READ_WITHOUT_STALLING)
361 ON_CALL(*decoder_, CanReadWithoutStalling()).WillByDefault(Return(false)); 366 ON_CALL(*decoder_, CanReadWithoutStalling()).WillByDefault(Return(false));
362 367
363 QueueFrames("0 20 40 60"); 368 QueueFrames("0 20 40 60");
364 { 369 {
365 WaitableMessageLoopEvent event; 370 WaitableMessageLoopEvent event;
366 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 371 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
367 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)) 372 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH))
368 .WillOnce(RunClosure(event.GetClosure())); 373 .WillOnce(RunClosure(event.GetClosure()));
369 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 374 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
375 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
376 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
370 StartPlayingFrom(0); 377 StartPlayingFrom(0);
371 event.RunAndWait(); 378 event.RunAndWait();
372 Mock::VerifyAndClearExpectations(&mock_cb_); 379 Mock::VerifyAndClearExpectations(&mock_cb_);
373 } 380 }
374 381
375 renderer_->OnTimeStateChanged(true); 382 renderer_->OnTimeStateChanged(true);
376 time_source_.StartTicking(); 383 time_source_.StartTicking();
377 384
378 // Advance time, this should cause have nothing to be signaled. 385 // Advance time, this should cause have nothing to be signaled.
379 { 386 {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
494 Initialize(); 501 Initialize();
495 Destroy(); 502 Destroy();
496 } 503 }
497 504
498 TEST_F(VideoRendererImplTest, InitializeAndStartPlayingFrom) { 505 TEST_F(VideoRendererImplTest, InitializeAndStartPlayingFrom) {
499 Initialize(); 506 Initialize();
500 QueueFrames("0 10 20 30"); 507 QueueFrames("0 10 20 30");
501 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 508 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
502 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 509 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
503 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 510 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
511 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
512 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
504 StartPlayingFrom(0); 513 StartPlayingFrom(0);
505 Destroy(); 514 Destroy();
506 } 515 }
507 516
508 TEST_F(VideoRendererImplTest, InitializeAndEndOfStream) { 517 TEST_F(VideoRendererImplTest, InitializeAndEndOfStream) {
509 Initialize(); 518 Initialize();
510 StartPlayingFrom(0); 519 StartPlayingFrom(0);
511 WaitForPendingRead(); 520 WaitForPendingRead();
512 { 521 {
513 SCOPED_TRACE("Waiting for BUFFERING_HAVE_ENOUGH"); 522 SCOPED_TRACE("Waiting for BUFFERING_HAVE_ENOUGH");
(...skipping 14 matching lines...) Expand all
528 CallInitialize(NewExpectedStatusCB(PIPELINE_ERROR_ABORT), false, PIPELINE_OK); 537 CallInitialize(NewExpectedStatusCB(PIPELINE_ERROR_ABORT), false, PIPELINE_OK);
529 Destroy(); 538 Destroy();
530 } 539 }
531 540
532 TEST_F(VideoRendererImplTest, DestroyWhileFlushing) { 541 TEST_F(VideoRendererImplTest, DestroyWhileFlushing) {
533 Initialize(); 542 Initialize();
534 QueueFrames("0 10 20 30"); 543 QueueFrames("0 10 20 30");
535 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 544 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
536 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 545 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
537 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 546 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
547 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
548 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
538 StartPlayingFrom(0); 549 StartPlayingFrom(0);
539 renderer_->Flush(NewExpectedClosure()); 550 renderer_->Flush(NewExpectedClosure());
540 Destroy(); 551 Destroy();
541 } 552 }
542 553
543 TEST_F(VideoRendererImplTest, Play) { 554 TEST_F(VideoRendererImplTest, Play) {
544 Initialize(); 555 Initialize();
545 QueueFrames("0 10 20 30"); 556 QueueFrames("0 10 20 30");
546 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 557 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
547 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 558 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
548 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 559 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
560 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
561 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
549 StartPlayingFrom(0); 562 StartPlayingFrom(0);
550 Destroy(); 563 Destroy();
551 } 564 }
552 565
553 TEST_F(VideoRendererImplTest, FlushWithNothingBuffered) { 566 TEST_F(VideoRendererImplTest, FlushWithNothingBuffered) {
554 Initialize(); 567 Initialize();
555 StartPlayingFrom(0); 568 StartPlayingFrom(0);
556 569
557 // We shouldn't expect a buffering state change since we never reached 570 // We shouldn't expect a buffering state change since we never reached
558 // BUFFERING_HAVE_ENOUGH. 571 // BUFFERING_HAVE_ENOUGH.
559 Flush(); 572 Flush();
560 Destroy(); 573 Destroy();
561 } 574 }
562 575
563 TEST_F(VideoRendererImplTest, DecodeError_Playing) { 576 TEST_F(VideoRendererImplTest, DecodeError_Playing) {
564 Initialize(); 577 Initialize();
565 QueueFrames("0 10 20 30"); 578 QueueFrames("0 10 20 30");
566 EXPECT_CALL(mock_cb_, FrameReceived(_)).Times(testing::AtLeast(1)); 579 EXPECT_CALL(mock_cb_, FrameReceived(_)).Times(testing::AtLeast(1));
567 580
568 // Consider the case that rendering is faster than we setup the test event. 581 // Consider the case that rendering is faster than we setup the test event.
569 // In that case, when we run out of the frames, BUFFERING_HAVE_NOTHING will 582 // In that case, when we run out of the frames, BUFFERING_HAVE_NOTHING will
570 // be called. 583 // be called.
571 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 584 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
572 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)) 585 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING))
573 .Times(testing::AtMost(1)); 586 .Times(testing::AtMost(1));
574 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 587 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
588 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
589 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
575 590
576 StartPlayingFrom(0); 591 StartPlayingFrom(0);
577 renderer_->OnTimeStateChanged(true); 592 renderer_->OnTimeStateChanged(true);
578 time_source_.StartTicking(); 593 time_source_.StartTicking();
579 AdvanceTimeInMs(10); 594 AdvanceTimeInMs(10);
580 595
581 QueueFrames("error"); 596 QueueFrames("error");
582 SatisfyPendingRead(); 597 SatisfyPendingRead();
583 WaitForError(PIPELINE_ERROR_DECODE); 598 WaitForError(PIPELINE_ERROR_DECODE);
584 Destroy(); 599 Destroy();
585 } 600 }
586 601
587 TEST_F(VideoRendererImplTest, DecodeError_DuringStartPlayingFrom) { 602 TEST_F(VideoRendererImplTest, DecodeError_DuringStartPlayingFrom) {
588 Initialize(); 603 Initialize();
589 QueueFrames("error"); 604 QueueFrames("error");
590 EXPECT_CALL(mock_cb_, OnError(PIPELINE_ERROR_DECODE)); 605 EXPECT_CALL(mock_cb_, OnError(PIPELINE_ERROR_DECODE));
591 StartPlayingFrom(0); 606 StartPlayingFrom(0);
592 Destroy(); 607 Destroy();
593 } 608 }
594 609
595 TEST_F(VideoRendererImplTest, StartPlayingFrom_Exact) { 610 TEST_F(VideoRendererImplTest, StartPlayingFrom_Exact) {
596 Initialize(); 611 Initialize();
597 QueueFrames("50 60 70 80 90"); 612 QueueFrames("50 60 70 80 90");
598 613
599 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(60))); 614 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(60)));
600 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 615 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
601 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 616 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
617 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
618 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
602 StartPlayingFrom(60); 619 StartPlayingFrom(60);
603 Destroy(); 620 Destroy();
604 } 621 }
605 622
606 TEST_F(VideoRendererImplTest, StartPlayingFrom_RightBefore) { 623 TEST_F(VideoRendererImplTest, StartPlayingFrom_RightBefore) {
607 Initialize(); 624 Initialize();
608 QueueFrames("50 60 70 80 90"); 625 QueueFrames("50 60 70 80 90");
609 626
610 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(50))); 627 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(50)));
611 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 628 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
612 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 629 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
630 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
631 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
613 StartPlayingFrom(59); 632 StartPlayingFrom(59);
614 Destroy(); 633 Destroy();
615 } 634 }
616 635
617 TEST_F(VideoRendererImplTest, StartPlayingFrom_RightAfter) { 636 TEST_F(VideoRendererImplTest, StartPlayingFrom_RightAfter) {
618 Initialize(); 637 Initialize();
619 QueueFrames("50 60 70 80 90"); 638 QueueFrames("50 60 70 80 90");
620 639
621 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(60))); 640 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(60)));
622 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 641 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
623 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 642 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
643 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
644 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
624 StartPlayingFrom(61); 645 StartPlayingFrom(61);
625 Destroy(); 646 Destroy();
626 } 647 }
627 648
628 TEST_F(VideoRendererImplTest, StartPlayingFrom_LowDelay) { 649 TEST_F(VideoRendererImplTest, StartPlayingFrom_LowDelay) {
629 // In low-delay mode only one frame is required to finish preroll. But frames 650 // In low-delay mode only one frame is required to finish preroll. But frames
630 // prior to the start time will not be used. 651 // prior to the start time will not be used.
631 InitializeWithLowDelay(true); 652 InitializeWithLowDelay(true);
632 QueueFrames("0 10"); 653 QueueFrames("0 10");
633 654
634 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(10))); 655 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(10)));
635 // Expect some amount of have enough/nothing due to only requiring one frame. 656 // Expect some amount of have enough/nothing due to only requiring one frame.
636 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)) 657 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH))
637 .Times(AnyNumber()); 658 .Times(AnyNumber());
638 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)) 659 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING))
639 .Times(AnyNumber()); 660 .Times(AnyNumber());
640 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 661 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
662 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
663 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
641 StartPlayingFrom(10); 664 StartPlayingFrom(10);
642 665
643 QueueFrames("20"); 666 QueueFrames("20");
644 SatisfyPendingRead(); 667 SatisfyPendingRead();
645 668
646 renderer_->OnTimeStateChanged(true); 669 renderer_->OnTimeStateChanged(true);
647 time_source_.StartTicking(); 670 time_source_.StartTicking();
648 671
649 WaitableMessageLoopEvent event; 672 WaitableMessageLoopEvent event;
650 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(20))) 673 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(20)))
651 .WillOnce(RunClosure(event.GetClosure())); 674 .WillOnce(RunClosure(event.GetClosure()));
652 AdvanceTimeInMs(20); 675 AdvanceTimeInMs(20);
653 event.RunAndWait(); 676 event.RunAndWait();
654 677
655 Destroy(); 678 Destroy();
656 } 679 }
657 680
658 // Verify that a late decoder response doesn't break invariants in the renderer. 681 // Verify that a late decoder response doesn't break invariants in the renderer.
659 TEST_F(VideoRendererImplTest, DestroyDuringOutstandingRead) { 682 TEST_F(VideoRendererImplTest, DestroyDuringOutstandingRead) {
660 Initialize(); 683 Initialize();
661 QueueFrames("0 10 20 30"); 684 QueueFrames("0 10 20 30");
662 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 685 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
663 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 686 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
664 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 687 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
688 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
689 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
665 StartPlayingFrom(0); 690 StartPlayingFrom(0);
666 691
667 // Check that there is an outstanding Read() request. 692 // Check that there is an outstanding Read() request.
668 EXPECT_TRUE(IsReadPending()); 693 EXPECT_TRUE(IsReadPending());
669 694
670 Destroy(); 695 Destroy();
671 } 696 }
672 697
673 TEST_F(VideoRendererImplTest, VideoDecoder_InitFailure) { 698 TEST_F(VideoRendererImplTest, VideoDecoder_InitFailure) {
674 InitializeRenderer(false, false); 699 InitializeRenderer(false, false);
(...skipping 26 matching lines...) Expand all
701 726
702 // Verifies that the sink is stopped after rendering the first frame if 727 // Verifies that the sink is stopped after rendering the first frame if
703 // playback hasn't started. 728 // playback hasn't started.
704 TEST_F(VideoRendererImplTest, RenderingStopsAfterFirstFrame) { 729 TEST_F(VideoRendererImplTest, RenderingStopsAfterFirstFrame) {
705 InitializeWithLowDelay(true); 730 InitializeWithLowDelay(true);
706 QueueFrames("0"); 731 QueueFrames("0");
707 732
708 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 733 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
709 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 734 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
710 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 735 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
736 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
737 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
711 EXPECT_CALL(mock_cb_, OnEnded()).Times(0); 738 EXPECT_CALL(mock_cb_, OnEnded()).Times(0);
712 739
713 { 740 {
714 SCOPED_TRACE("Waiting for sink to stop."); 741 SCOPED_TRACE("Waiting for sink to stop.");
715 WaitableMessageLoopEvent event; 742 WaitableMessageLoopEvent event;
716 743
717 null_video_sink_->set_background_render(true); 744 null_video_sink_->set_background_render(true);
718 null_video_sink_->set_stop_cb(event.GetClosure()); 745 null_video_sink_->set_stop_cb(event.GetClosure());
719 StartPlayingFrom(0); 746 StartPlayingFrom(0);
720 747
721 EXPECT_TRUE(IsReadPending()); 748 EXPECT_TRUE(IsReadPending());
722 SatisfyPendingReadWithEndOfStream(); 749 SatisfyPendingReadWithEndOfStream();
723 750
724 event.RunAndWait(); 751 event.RunAndWait();
725 } 752 }
726 753
727 Destroy(); 754 Destroy();
728 } 755 }
729 756
730 // Verifies that the sink is stopped after rendering the first frame if 757 // Verifies that the sink is stopped after rendering the first frame if
731 // playback ha started. 758 // playback ha started.
732 TEST_F(VideoRendererImplTest, RenderingStopsAfterOneFrameWithEOS) { 759 TEST_F(VideoRendererImplTest, RenderingStopsAfterOneFrameWithEOS) {
733 InitializeWithLowDelay(true); 760 InitializeWithLowDelay(true);
734 QueueFrames("0"); 761 QueueFrames("0");
735 762
736 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 763 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
737 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 764 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
738 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 765 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
766 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
767 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
739 768
740 { 769 {
741 SCOPED_TRACE("Waiting for sink to stop."); 770 SCOPED_TRACE("Waiting for sink to stop.");
742 WaitableMessageLoopEvent event; 771 WaitableMessageLoopEvent event;
743 772
744 null_video_sink_->set_stop_cb(event.GetClosure()); 773 null_video_sink_->set_stop_cb(event.GetClosure());
745 StartPlayingFrom(0); 774 StartPlayingFrom(0);
746 renderer_->OnTimeStateChanged(true); 775 renderer_->OnTimeStateChanged(true);
747 776
748 EXPECT_TRUE(IsReadPending()); 777 EXPECT_TRUE(IsReadPending());
(...skipping 17 matching lines...) Expand all
766 // zero value, once we have some decoded frames they should be overwritten. 795 // zero value, once we have some decoded frames they should be overwritten.
767 PipelineStatistics last_pipeline_statistics; 796 PipelineStatistics last_pipeline_statistics;
768 last_pipeline_statistics.video_frames_dropped = 1; 797 last_pipeline_statistics.video_frames_dropped = 1;
769 { 798 {
770 WaitableMessageLoopEvent event; 799 WaitableMessageLoopEvent event;
771 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 800 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
772 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))) 801 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)))
773 .WillOnce(RunClosure(event.GetClosure())); 802 .WillOnce(RunClosure(event.GetClosure()));
774 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)) 803 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_))
775 .WillRepeatedly(SaveArg<0>(&last_pipeline_statistics)); 804 .WillRepeatedly(SaveArg<0>(&last_pipeline_statistics));
805 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
806 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
776 StartPlayingFrom(0); 807 StartPlayingFrom(0);
777 event.RunAndWait(); 808 event.RunAndWait();
778 Mock::VerifyAndClearExpectations(&mock_cb_); 809 Mock::VerifyAndClearExpectations(&mock_cb_);
779 EXPECT_EQ(0u, last_pipeline_statistics.video_frames_dropped); 810 EXPECT_EQ(0u, last_pipeline_statistics.video_frames_dropped);
780 EXPECT_EQ(460800, last_pipeline_statistics.video_memory_usage); 811 EXPECT_EQ(460800, last_pipeline_statistics.video_memory_usage);
781 } 812 }
782 813
783 // Consider the case that rendering is faster than we setup the test event. 814 // Consider the case that rendering is faster than we setup the test event.
784 // In that case, when we run out of the frames, BUFFERING_HAVE_NOTHING will 815 // In that case, when we run out of the frames, BUFFERING_HAVE_NOTHING will
785 // be called. And then during SatisfyPendingReadWithEndOfStream, 816 // be called. And then during SatisfyPendingReadWithEndOfStream,
(...skipping 28 matching lines...) Expand all
814 845
815 TEST_F(VideoRendererImplTest, StartPlayingFromThenFlushThenEOS) { 846 TEST_F(VideoRendererImplTest, StartPlayingFromThenFlushThenEOS) {
816 Initialize(); 847 Initialize();
817 QueueFrames("0 30 60 90"); 848 QueueFrames("0 30 60 90");
818 849
819 WaitableMessageLoopEvent event; 850 WaitableMessageLoopEvent event;
820 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 851 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
821 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)) 852 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH))
822 .WillOnce(RunClosure(event.GetClosure())); 853 .WillOnce(RunClosure(event.GetClosure()));
823 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 854 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
855 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
856 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
824 StartPlayingFrom(0); 857 StartPlayingFrom(0);
825 event.RunAndWait(); 858 event.RunAndWait();
826 859
827 // Cycle ticking so that we get a non-null reference time. 860 // Cycle ticking so that we get a non-null reference time.
828 time_source_.StartTicking(); 861 time_source_.StartTicking();
829 time_source_.StopTicking(); 862 time_source_.StopTicking();
830 863
831 // Flush and simulate a seek past EOS, where some error prevents the decoder 864 // Flush and simulate a seek past EOS, where some error prevents the decoder
832 // from returning any frames. 865 // from returning any frames.
833 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING)); 866 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_NOTHING));
(...skipping 13 matching lines...) Expand all
847 // after the first frame. 880 // after the first frame.
848 ON_CALL(*decoder_, CanReadWithoutStalling()).WillByDefault(Return(false)); 881 ON_CALL(*decoder_, CanReadWithoutStalling()).WillByDefault(Return(false));
849 // Set background rendering to simulate the first couple of Render() calls 882 // Set background rendering to simulate the first couple of Render() calls
850 // by VFC. 883 // by VFC.
851 null_video_sink_->set_background_render(true); 884 null_video_sink_->set_background_render(true);
852 QueueFrames("0 10 20"); 885 QueueFrames("0 10 20");
853 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)) 886 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH))
854 .Times(testing::AtMost(1)); 887 .Times(testing::AtMost(1));
855 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 888 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
856 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 889 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
890 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
891 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
857 StartPlayingFrom(0); 892 StartPlayingFrom(0);
858 893
859 renderer_->OnTimeStateChanged(true); 894 renderer_->OnTimeStateChanged(true);
860 time_source_.StartTicking(); 895 time_source_.StartTicking();
861 896
862 WaitableMessageLoopEvent event; 897 WaitableMessageLoopEvent event;
863 // Frame "10" should not have been expired. 898 // Frame "10" should not have been expired.
864 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(10))) 899 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(10)))
865 .WillOnce(RunClosure(event.GetClosure())); 900 .WillOnce(RunClosure(event.GetClosure()));
866 AdvanceTimeInMs(10); 901 AdvanceTimeInMs(10);
867 event.RunAndWait(); 902 event.RunAndWait();
868 903
869 Destroy(); 904 Destroy();
870 } 905 }
871 906
907 TEST_F(VideoRendererImplTest, NaturalSizeChange) {
908 Initialize();
909
910 gfx::Size initial_size(8, 8);
911 gfx::Size larger_size(16, 16);
912
913 QueueFrame(DecodeStatus::OK,
914 VideoFrame::CreateFrame(PIXEL_FORMAT_YV12, initial_size,
915 gfx::Rect(initial_size), initial_size,
916 base::TimeDelta::FromMilliseconds(0)));
917 QueueFrame(DecodeStatus::OK,
918 VideoFrame::CreateFrame(PIXEL_FORMAT_YV12, larger_size,
919 gfx::Rect(larger_size), larger_size,
920 base::TimeDelta::FromMilliseconds(10)));
921 QueueFrame(DecodeStatus::OK,
922 VideoFrame::CreateFrame(PIXEL_FORMAT_YV12, larger_size,
923 gfx::Rect(larger_size), larger_size,
924 base::TimeDelta::FromMilliseconds(20)));
925 QueueFrame(DecodeStatus::OK,
926 VideoFrame::CreateFrame(PIXEL_FORMAT_YV12, initial_size,
927 gfx::Rect(initial_size), initial_size,
928 base::TimeDelta::FromMilliseconds(30)));
929
930 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
931 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
932 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
933
934 {
935 // Callback is fired for the first frame.
936 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(initial_size));
937 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
938 StartPlayingFrom(0);
939 renderer_->OnTimeStateChanged(true);
940 time_source_.StartTicking();
941 }
942 {
943 // Callback should be fired once when switching to the larger size.
944 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(larger_size));
945 WaitableMessageLoopEvent event;
946 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(10)))
947 .WillOnce(RunClosure(event.GetClosure()));
948 AdvanceTimeInMs(10);
949 event.RunAndWait();
950 }
951 {
952 // Called is not fired because frame size does not change.
953 WaitableMessageLoopEvent event;
954 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(20)))
955 .WillOnce(RunClosure(event.GetClosure()));
956 AdvanceTimeInMs(10);
957 event.RunAndWait();
958 }
959 {
960 // Callback is fired once when switching to the larger size.
961 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(initial_size));
962 WaitableMessageLoopEvent event;
963 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(30)))
964 .WillOnce(RunClosure(event.GetClosure()));
965 AdvanceTimeInMs(10);
966 event.RunAndWait();
967 }
968
969 Destroy();
970 }
971
972 TEST_F(VideoRendererImplTest, OpacityChange) {
973 Initialize();
974
975 gfx::Size frame_size(8, 8);
976 VideoPixelFormat opaque_format = PIXEL_FORMAT_YV12;
977 VideoPixelFormat non_opaque_format = PIXEL_FORMAT_YV12A;
978
979 QueueFrame(DecodeStatus::OK,
980 VideoFrame::CreateFrame(non_opaque_format, frame_size,
981 gfx::Rect(frame_size), frame_size,
982 base::TimeDelta::FromMilliseconds(0)));
983 QueueFrame(DecodeStatus::OK,
984 VideoFrame::CreateFrame(non_opaque_format, frame_size,
985 gfx::Rect(frame_size), frame_size,
986 base::TimeDelta::FromMilliseconds(10)));
987 QueueFrame(DecodeStatus::OK,
988 VideoFrame::CreateFrame(opaque_format, frame_size,
989 gfx::Rect(frame_size), frame_size,
990 base::TimeDelta::FromMilliseconds(20)));
991 QueueFrame(DecodeStatus::OK,
992 VideoFrame::CreateFrame(opaque_format, frame_size,
993 gfx::Rect(frame_size), frame_size,
994 base::TimeDelta::FromMilliseconds(30)));
995
996 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
997 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
998 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(frame_size)).Times(1);
999
1000 {
1001 // Callback is fired for the first frame.
1002 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(false));
1003 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
1004 StartPlayingFrom(0);
1005 renderer_->OnTimeStateChanged(true);
1006 time_source_.StartTicking();
1007 }
1008 {
1009 // Callback is not fired because opacity does not change.
1010 WaitableMessageLoopEvent event;
1011 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(10)))
1012 .WillOnce(RunClosure(event.GetClosure()));
1013 AdvanceTimeInMs(10);
1014 event.RunAndWait();
1015 }
1016 {
1017 // Called is fired when opacity changes.
1018 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(true));
1019 WaitableMessageLoopEvent event;
1020 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(20)))
1021 .WillOnce(RunClosure(event.GetClosure()));
1022 AdvanceTimeInMs(10);
1023 event.RunAndWait();
1024 }
1025 {
1026 // Callback is not fired because opacity does not change.
1027 WaitableMessageLoopEvent event;
1028 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(30)))
1029 .WillOnce(RunClosure(event.GetClosure()));
1030 AdvanceTimeInMs(10);
1031 event.RunAndWait();
1032 }
1033
1034 Destroy();
1035 }
1036
872 class VideoRendererImplAsyncAddFrameReadyTest : public VideoRendererImplTest { 1037 class VideoRendererImplAsyncAddFrameReadyTest : public VideoRendererImplTest {
873 public: 1038 public:
874 VideoRendererImplAsyncAddFrameReadyTest() { 1039 VideoRendererImplAsyncAddFrameReadyTest() {
875 std::unique_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool( 1040 std::unique_ptr<GpuMemoryBufferVideoFramePool> gpu_memory_buffer_pool(
876 new MockGpuMemoryBufferVideoFramePool(&frame_ready_cbs_)); 1041 new MockGpuMemoryBufferVideoFramePool(&frame_ready_cbs_));
877 renderer_->SetGpuMemoryBufferVideoForTesting( 1042 renderer_->SetGpuMemoryBufferVideoForTesting(
878 std::move(gpu_memory_buffer_pool)); 1043 std::move(gpu_memory_buffer_pool));
879 } 1044 }
880 1045
881 protected: 1046 protected:
882 std::vector<base::Closure> frame_ready_cbs_; 1047 std::vector<base::Closure> frame_ready_cbs_;
883 }; 1048 };
884 1049
885 TEST_F(VideoRendererImplAsyncAddFrameReadyTest, InitializeAndStartPlayingFrom) { 1050 TEST_F(VideoRendererImplAsyncAddFrameReadyTest, InitializeAndStartPlayingFrom) {
886 Initialize(); 1051 Initialize();
887 QueueFrames("0 10 20 30"); 1052 QueueFrames("0 10 20 30");
888 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0))); 1053 EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(0)));
889 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH)); 1054 EXPECT_CALL(mock_cb_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH));
890 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber()); 1055 EXPECT_CALL(mock_cb_, OnStatisticsUpdate(_)).Times(AnyNumber());
1056 EXPECT_CALL(mock_cb_, OnVideoNaturalSizeChange(_)).Times(1);
1057 EXPECT_CALL(mock_cb_, OnVideoOpacityChange(_)).Times(1);
891 StartPlayingFrom(0); 1058 StartPlayingFrom(0);
892 ASSERT_EQ(1u, frame_ready_cbs_.size()); 1059 ASSERT_EQ(1u, frame_ready_cbs_.size());
893 1060
894 uint32_t frame_ready_index = 0; 1061 uint32_t frame_ready_index = 0;
895 while (frame_ready_index < frame_ready_cbs_.size()) { 1062 while (frame_ready_index < frame_ready_cbs_.size()) {
896 frame_ready_cbs_[frame_ready_index++].Run(); 1063 frame_ready_cbs_[frame_ready_index++].Run();
897 message_loop_.RunUntilIdle(); 1064 message_loop_.RunUntilIdle();
898 } 1065 }
899 Destroy(); 1066 Destroy();
900 } 1067 }
901 1068
902 TEST_F(VideoRendererImplAsyncAddFrameReadyTest, SequenceTokenDiscardOneFrame) { 1069 TEST_F(VideoRendererImplAsyncAddFrameReadyTest, SequenceTokenDiscardOneFrame) {
903 Initialize(); 1070 Initialize();
904 QueueFrames("0 10 20 30"); 1071 QueueFrames("0 10 20 30");
905 StartPlayingFrom(0); 1072 StartPlayingFrom(0);
906 Flush(); 1073 Flush();
907 ASSERT_EQ(1u, frame_ready_cbs_.size()); 1074 ASSERT_EQ(1u, frame_ready_cbs_.size());
908 // This frame will be discarded. 1075 // This frame will be discarded.
909 frame_ready_cbs_.front().Run(); 1076 frame_ready_cbs_.front().Run();
910 Destroy(); 1077 Destroy();
911 } 1078 }
912 1079
913 } // namespace media 1080 } // namespace media
OLDNEW
« no previous file with comments | « media/renderers/video_renderer_impl.cc ('k') | media/test/pipeline_integration_test_base.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698