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

Side by Side Diff: content/renderer/media/webmediaplayer_ms_unittest.cc

Issue 1417533006: Unit test for WebMediaPlayerMS (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Unittest Created 5 years, 2 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
(Empty)
1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/bind.h"
6 #include "base/logging.h"
7 #include "base/message_loop/message_loop.h"
8 #include "base/strings/string_number_conversions.h"
9 #include "base/strings/string_split.h"
10 #include "cc/layers/video_frame_provider.h"
11 #include "content/public/renderer/media_stream_renderer_factory.h"
12 #include "content/public/renderer/video_frame_provider.h"
13 #include "content/renderer/media/mock_media_constraint_factory.h"
14 #include "content/renderer/media/render_media_log.h"
15 #include "content/renderer/media/webmediaplayer_ms.h"
16 #include "content/renderer/media/webrtc_audio_renderer.h"
17 #include "content/renderer/render_frame_impl.h"
18 #include "media/base/gmock_callback_support.h"
19 #include "media/base/mock_filters.h"
20 #include "media/base/test_helpers.h"
21 #include "media/base/video_frame.h"
22 #include "testing/gmock/include/gmock/gmock.h"
23 #include "testing/gtest/include/gtest/gtest.h"
24
25 #include "third_party/WebKit/public/platform/WebMediaPlayer.h"
26 #include "third_party/WebKit/public/platform/WebMediaPlayerClient.h"
27 #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
mcasas 2015/10/21 19:54:02 Needed? (check all header please).
qiangchen 2015/10/22 17:22:58 Done. Looks like many includes are included in te
28
29 namespace content {
30
31 class WebMediaPlayerMSTest;
32
33 class MockCB {
mcasas 2015/10/21 19:54:02 There's indeed plenty of Mock/Test dependent class
qiangchen 2015/10/22 17:22:58 My investigation shows only content::VideoFramePro
34 public:
35 MOCK_METHOD0(StartRendering, void());
36 MOCK_METHOD0(StopRendering, void());
37
38 MOCK_METHOD1(NetworkStateChanged, void(blink::WebMediaPlayer::NetworkState));
39 MOCK_METHOD1(ReadyStateChanged, void(blink::WebMediaPlayer::ReadyState));
40 void VerifyAndClearExpectations() {
41 // Note: the raw value of "this" could be different from &mock_cb_.
42 // So this is not equivalent with calling
43 // VerifyAndClearExpectations(&mock_cb_) outside.
44 testing::Mock::VerifyAndClearExpectations(this);
45 }
46 };
47
48 struct TestFrame {
49 enum TestFrameType {
50 NORMAL_FRAME,
51 BROKEN_FRAME,
52 TEST_BRAKE // Signal to pause message loop.
53 };
54 TestFrame(TestFrameType input_category,
55 const scoped_refptr<media::VideoFrame>& input_frame)
56 : category(input_category), frame(input_frame) {}
57
58 TestFrameType category;
59 scoped_refptr<media::VideoFrame> frame;
60 };
61
62 class ReusableMessageLoopEvent {
63 public:
64 ReusableMessageLoopEvent() : event_(new media::WaitableMessageLoopEvent()) {}
65
66 base::Closure GetClosure() { return event_->GetClosure(); }
67
68 media::PipelineStatusCB GetPipelineStatusCB() {
69 return event_->GetPipelineStatusCB();
70 }
71
72 void RunAndWait() {
73 event_->RunAndWait();
74 event_.reset(new media::WaitableMessageLoopEvent());
75 }
76
77 void RunAndWaitForStatus(media::PipelineStatus expected) {
78 event_->RunAndWaitForStatus(expected);
79 event_.reset(new media::WaitableMessageLoopEvent());
80 }
81
82 private:
83 scoped_ptr<media::WaitableMessageLoopEvent> event_;
84 };
85
86 // The class mainly used to inject VideoFrames into WebMediaPlayerMS.
87 class MockVideoFrameProvider : public VideoFrameProvider {
88 public:
89 MockVideoFrameProvider(base::MessageLoop* message_loop,
90 ReusableMessageLoopEvent* message_loop_controller,
91 const base::Closure& error_cb,
92 const VideoFrameProvider::RepaintCB& repaint_cb)
93 : started_(false),
94 message_loop_(message_loop),
95 message_loop_controller_(message_loop_controller),
96 error_cb_(error_cb),
97 repaint_cb_(repaint_cb),
98 delay_(base::TimeDelta::FromSecondsD(1.0 / 30.0)) {}
99
100 // Implementation of VideoFrameProvider
101 void Start() override;
102 void Stop() override;
103 void Play() override;
104 void Pause() override;
105
106 // Methods for test use
107 void QueueFrames(const std::string& str);
mcasas 2015/10/21 19:54:02 I don't see much added value in creating/passing t
qiangchen 2015/10/22 17:22:58 Done.
108 void PrepareFrame(TestFrame::TestFrameType category,
109 const scoped_refptr<media::VideoFrame>& frame);
110 bool Started();
111 bool Paused();
112
113 private:
114 ~MockVideoFrameProvider() override {}
115
116 // Main function that pushes frame into WebMediaPlayerMS
117 void InjectFrame();
118
119 bool started_;
120 bool paused_;
121
122 base::MessageLoop* message_loop_;
123 ReusableMessageLoopEvent* message_loop_controller_;
124 base::Closure error_cb_;
125 VideoFrameProvider::RepaintCB repaint_cb_;
126
127 std::deque<TestFrame> frames_;
128 base::TimeDelta delay_;
129 };
130
131 // The class is used to generate MockVideoProvider
132 class MockRenderFactory : public MediaStreamRendererFactory {
133 public:
134 MockRenderFactory(base::MessageLoop* message_loop,
135 ReusableMessageLoopEvent* message_loop_controller)
136 : message_loop_(message_loop),
137 message_loop_controller_(message_loop_controller) {}
138
139 scoped_refptr<VideoFrameProvider> GetVideoFrameProvider(
140 const GURL& url,
141 const base::Closure& error_cb,
142 const VideoFrameProvider::RepaintCB& repaint_cb,
143 const scoped_refptr<base::SingleThreadTaskRunner>& media_task_runner,
144 const scoped_refptr<base::TaskRunner>& worker_task_runner,
145 media::GpuVideoAcceleratorFactories* gpu_factories) override;
146
147 MockVideoFrameProvider* GetVideoFrameProvider();
148
149 scoped_refptr<MediaStreamAudioRenderer> GetAudioRenderer(
150 const GURL& url,
151 int render_frame_id,
152 const std::string& device_id,
153 const url::Origin& security_origin) override;
154
155 private:
156 base::MessageLoop* message_loop_;
157 scoped_refptr<VideoFrameProvider> provider_;
158 ReusableMessageLoopEvent* message_loop_controller_;
159 };
160
161 // The class is responsible to pull frames from WebMediaPlayerMS
162 class MockVideoFrameProviderClient : public cc::VideoFrameProvider::Client {
163 public:
164 MockVideoFrameProviderClient(base::MessageLoop* message_loop,
165 cc::VideoFrameProvider* compositor,
166 MockCB* mock_cb)
167 : rendering_(false),
168 background_rendering_(false),
169 message_loop_(message_loop),
170 compositor_(compositor),
171 mock_cb_(mock_cb) {}
172
173 // Implementation of cc::VideoFrameProvider::Client
174 void StopUsingProvider() override;
175 void StartRendering() override;
176 void StopRendering() override;
177 void DidReceiveFrame() override {}
178 void DidUpdateMatrix(const float* matrix) override {}
179
180 // For test use
181 void SetBackgroundRendering(bool background_rendering);
182
183 private:
184 // Main function trying to ask WebMediaPlayerMS to submit a frame for
185 // rendering.
186 void RenderFrame();
187
188 bool rendering_;
189 bool background_rendering_;
190 base::MessageLoop* message_loop_;
191 cc::VideoFrameProvider* compositor_;
192 MockCB* mock_cb_;
193 };
194
195 // This class is used to respond to WebMediaPlayerMS status change.
196 class MockClient : public blink::WebMediaPlayerClient {
197 public:
198 MockClient(WebMediaPlayerMSTest* test,
199 WebMediaPlayerMS* player,
200 base::MessageLoop* message_loop,
201 ReusableMessageLoopEvent* message_loop_controller)
202 : test_(test),
203 player_(player),
204 message_loop_(message_loop),
205 message_loop_controller_(message_loop_controller),
206 compositor_(nullptr) {}
207 ~MockClient() {}
208
209 // Implementation of WebMediaPlayerClient
210 void networkStateChanged() override;
211 void readyStateChanged() override;
212 void timeChanged() override {}
213 void repaint() override {}
214 void durationChanged() override {}
215 void sizeChanged() override {}
216 void playbackStateChanged() override {}
217 void setWebLayer(blink::WebLayer* layer) override;
218 blink::WebMediaPlayer::TrackId addAudioTrack(const blink::WebString& id,
219 AudioTrackKind,
220 const blink::WebString& label,
221 const blink::WebString& language,
222 bool enabled) override;
223 void removeAudioTrack(blink::WebMediaPlayer::TrackId) override {}
224 blink::WebMediaPlayer::TrackId addVideoTrack(const blink::WebString& id,
225 VideoTrackKind,
226 const blink::WebString& label,
227 const blink::WebString& language,
228 bool selected) override;
229 void removeVideoTrack(blink::WebMediaPlayer::TrackId) override {}
230 void addTextTrack(blink::WebInbandTextTrack*) override {}
231 void removeTextTrack(blink::WebInbandTextTrack*) override {}
232 void mediaSourceOpened(blink::WebMediaSource*) override {}
233 void requestSeek(double) override {}
234 void remoteRouteAvailabilityChanged(bool) override {}
235 void connectedToRemoteDevice() override {}
236 void disconnectedFromRemoteDevice() override {}
237
238 // For test use
239 MockVideoFrameProviderClient* GetVideoFrameProviderClient();
240
241 private:
242 WebMediaPlayerMSTest* test_;
243 WebMediaPlayerMS* player_;
244 base::MessageLoop* message_loop_;
245 ReusableMessageLoopEvent* message_loop_controller_;
246 cc::VideoFrameProvider* compositor_;
247 scoped_ptr<MockVideoFrameProviderClient> video_frame_provider_client_;
248 };
249
250 class WebMediaPlayerMSTest : public testing::Test {
251 public:
252 WebMediaPlayerMSTest()
253 : client_(this, &player_, &message_loop_, &message_loop_controller_),
254 render_factory_(
255 new MockRenderFactory(&message_loop_, &message_loop_controller_)),
256 player_(nullptr,
257 &client_,
258 base::WeakPtr<RenderFrameImpl>(),
259 new media::MediaLog(),
260 scoped_ptr<MediaStreamRendererFactory>(render_factory_),
261 message_loop_.task_runner(),
262 message_loop_.task_runner(),
263 message_loop_.task_runner(),
264 nullptr) {}
265 ~WebMediaPlayerMSTest() override {}
266
267 MockVideoFrameProvider* LoadAndGetFrameProvider(bool algorithm_enabled);
268 cc::VideoFrameProvider* GetCompositorForTest();
269 MockCB* GetMockCB();
270
271 protected:
272 // Use StrictMock<T> to catch missing/extra callbacks.
273 testing::StrictMock<MockCB> mock_cb_;
274
275 base::MessageLoop message_loop_;
276 MockClient client_;
277 MockRenderFactory* render_factory_;
278 WebMediaPlayerMS player_;
279 cc::VideoFrameProvider* compositor_;
280
281 ReusableMessageLoopEvent message_loop_controller_;
282 };
283
284 MockVideoFrameProvider* WebMediaPlayerMSTest::LoadAndGetFrameProvider(
285 bool algorithm_enabled) {
286 MockVideoFrameProvider* provider = render_factory_->GetVideoFrameProvider();
287 EXPECT_EQ(nullptr, provider);
288
289 EXPECT_CALL(mock_cb_,
290 NetworkStateChanged(blink::WebMediaPlayer::NetworkStateLoading));
291 EXPECT_CALL(mock_cb_,
292 ReadyStateChanged(blink::WebMediaPlayer::ReadyStateHaveNothing));
293 compositor_ = player_.LoadForTesting(algorithm_enabled);
294
295 provider = render_factory_->GetVideoFrameProvider();
296 EXPECT_NE(nullptr, provider);
297 EXPECT_TRUE(provider->Started());
298
299 mock_cb_.VerifyAndClearExpectations();
300 return provider;
301 }
302
303 cc::VideoFrameProvider* WebMediaPlayerMSTest::GetCompositorForTest() {
304 return compositor_;
305 }
306
307 MockCB* WebMediaPlayerMSTest::GetMockCB() {
308 return &mock_cb_;
309 }
310
311 void MockVideoFrameProvider::Start() {
312 started_ = true;
313 paused_ = false;
314 message_loop_->PostTask(
315 FROM_HERE,
316 base::Bind(&MockVideoFrameProvider::InjectFrame, base::Unretained(this)));
317 }
318
319 void MockVideoFrameProvider::Stop() {
320 started_ = false;
321 frames_.clear();
322 }
323
324 void MockVideoFrameProvider::Play() {
325 CHECK(started_);
326 paused_ = false;
327 }
328
329 void MockVideoFrameProvider::Pause() {
330 CHECK(started_);
331 paused_ = true;
332 }
333
334 void MockVideoFrameProvider::PrepareFrame(
335 TestFrame::TestFrameType category,
336 const scoped_refptr<media::VideoFrame>& frame) {
337 frames_.push_back(TestFrame(category, frame));
338 }
339
340 void MockVideoFrameProvider::QueueFrames(const std::string& str) {
341 for (const std::string& token : base::SplitString(
342 str, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) {
343 if (token == "error") {
344 PrepareFrame(TestFrame::TestFrameType::BROKEN_FRAME, nullptr);
345 continue;
346 }
347 if (token == "brake") {
348 PrepareFrame(TestFrame::TestFrameType::TEST_BRAKE, nullptr);
349 continue;
350 }
351
352 int timestamp_in_ms = 0;
353 if (base::StringToInt(token, &timestamp_in_ms)) {
354 gfx::Size natural_size = media::TestVideoConfig::NormalCodedSize();
355 auto frame = media::VideoFrame::CreateFrame(
356 media::PIXEL_FORMAT_YV12, natural_size, gfx::Rect(natural_size),
357 natural_size, base::TimeDelta::FromMilliseconds(timestamp_in_ms));
358
359 frame->metadata()->SetTimeTicks(
360 media::VideoFrameMetadata::Key::REFERENCE_TIME,
361 base::TimeTicks::Now() +
362 base::TimeDelta::FromMilliseconds(timestamp_in_ms));
363
364 PrepareFrame(TestFrame::TestFrameType::NORMAL_FRAME, frame);
365 continue;
366 }
367
368 CHECK(false) << "Unrecognized token: " << token;
369 }
370 }
371
372 bool MockVideoFrameProvider::Started() {
373 return started_;
374 }
375
376 bool MockVideoFrameProvider::Paused() {
377 return paused_;
378 }
379
380 void MockVideoFrameProvider::InjectFrame() {
381 if (!started_)
382 return;
383
384 if (frames_.empty()) {
385 message_loop_controller_->GetClosure().Run();
386 return;
387 }
388
389 auto frame = frames_.front();
390 frames_.pop_front();
391
392 if (frame.category == TestFrame::TestFrameType::BROKEN_FRAME) {
393 error_cb_.Run();
394 return;
395 }
396
397 // For pause case, the provider will still let the stream continue, but
398 // not send the frames to the player. As is the same case in reality.
399 if (frame.category == TestFrame::TestFrameType::NORMAL_FRAME) {
400 if (!paused_)
401 repaint_cb_.Run(frame.frame);
402
403 size_t i = 0;
404 while (i < frames_.size() &&
405 frames_[i].category != TestFrame::TestFrameType::NORMAL_FRAME) {
406 ++i;
407 }
408
409 if (i < frames_.size()) {
410 delay_ =
411 (frames_[i].frame->timestamp() - frame.frame->timestamp()) / (i + 1);
412 }
413 }
414
415 message_loop_->PostDelayedTask(
416 FROM_HERE,
417 base::Bind(&MockVideoFrameProvider::InjectFrame, base::Unretained(this)),
418 delay_);
419
420 if (frame.category == TestFrame::TestFrameType::TEST_BRAKE)
421 message_loop_controller_->GetClosure().Run();
422 }
423
424 scoped_refptr<VideoFrameProvider> MockRenderFactory::GetVideoFrameProvider(
425 const GURL& url,
426 const base::Closure& error_cb,
427 const VideoFrameProvider::RepaintCB& repaint_cb,
428 const scoped_refptr<base::SingleThreadTaskRunner>& /*media_task_runner*/,
429 const scoped_refptr<base::TaskRunner>& /*worker_task_runner*/,
430 media::GpuVideoAcceleratorFactories* /*gpu_factories*/) {
431 provider_ = new MockVideoFrameProvider(
432 message_loop_, message_loop_controller_, error_cb, repaint_cb);
433
434 return provider_;
435 }
436
437 MockVideoFrameProvider* MockRenderFactory::GetVideoFrameProvider() {
438 return static_cast<MockVideoFrameProvider*>(provider_.get());
439 }
440
441 scoped_refptr<MediaStreamAudioRenderer> MockRenderFactory::GetAudioRenderer(
442 const GURL& url,
443 int render_frame_id,
444 const std::string& device_id,
445 const url::Origin& security_origin) {
446 return nullptr;
447 }
448
449 void MockClient::networkStateChanged() {
450 blink::WebMediaPlayer::NetworkState state = player_->networkState();
451 test_->GetMockCB()->NetworkStateChanged(state);
452 if (state == blink::WebMediaPlayer::NetworkState::NetworkStateFormatError ||
453 state == blink::WebMediaPlayer::NetworkState::NetworkStateDecodeError ||
454 state == blink::WebMediaPlayer::NetworkState::NetworkStateNetworkError)
455 message_loop_controller_->GetPipelineStatusCB().Run(
456 media::PipelineStatus::PIPELINE_ERROR_NETWORK);
457 }
458
459 void MockClient::readyStateChanged() {
460 blink::WebMediaPlayer::ReadyState state = player_->readyState();
461 test_->GetMockCB()->ReadyStateChanged(state);
462 if (state == blink::WebMediaPlayer::ReadyState::ReadyStateHaveEnoughData)
463 player_->play();
464 }
465
466 blink::WebMediaPlayer::TrackId MockClient::addAudioTrack(
467 const blink::WebString& id,
468 AudioTrackKind,
469 const blink::WebString& label,
470 const blink::WebString& language,
471 bool enabled) {
472 return 0;
473 }
474
475 blink::WebMediaPlayer::TrackId MockClient::addVideoTrack(
476 const blink::WebString& id,
477 VideoTrackKind,
478 const blink::WebString& label,
479 const blink::WebString& language,
480 bool selected) {
481 return 0;
482 }
483
484 void MockVideoFrameProviderClient::StopUsingProvider() {
485 if (rendering_)
486 StopRendering();
487 compositor_ = nullptr;
488 }
489
490 void MockVideoFrameProviderClient::StartRendering() {
491 if (!rendering_) {
492 rendering_ = true;
493 message_loop_->PostTask(
494 FROM_HERE, base::Bind(&MockVideoFrameProviderClient::RenderFrame,
495 base::Unretained(this)));
496 }
497 mock_cb_->StartRendering();
498 }
499
500 void MockVideoFrameProviderClient::StopRendering() {
501 rendering_ = false;
502 mock_cb_->StopRendering();
503 }
504
505 void MockVideoFrameProviderClient::SetBackgroundRendering(
506 bool background_rendering) {
507 background_rendering_ = background_rendering;
508 }
509
510 void MockVideoFrameProviderClient::RenderFrame() {
511 if (!rendering_ || !compositor_)
512 return;
513
514 base::TimeTicks now = base::TimeTicks::Now();
515 base::TimeTicks deadline_min =
516 now + base::TimeDelta::FromSecondsD(1.0 / 60.0);
517 base::TimeTicks deadline_max =
518 deadline_min + base::TimeDelta::FromSecondsD(1.0 / 60.0);
519
520 // Background rendering is different from stop rendering. The rendering loop
521 // is still running but we do not ask frames from compositor_. And background
522 // rendering is not initiated from compositor_.
523 if (!background_rendering_) {
524 compositor_->UpdateCurrentFrame(deadline_min, deadline_max);
525 auto frame = compositor_->GetCurrentFrame();
526 compositor_->PutCurrentFrame();
527 }
528 message_loop_->PostDelayedTask(
529 FROM_HERE, base::Bind(&MockVideoFrameProviderClient::RenderFrame,
530 base::Unretained(this)),
531 base::TimeDelta::FromSecondsD(1.0 / 60.0));
532 }
533
534 void MockClient::setWebLayer(blink::WebLayer* layer) {
535 if (layer) {
536 compositor_ = test_->GetCompositorForTest();
537 video_frame_provider_client_.reset(new MockVideoFrameProviderClient(
538 message_loop_, compositor_, test_->GetMockCB()));
539 compositor_->SetVideoFrameProviderClient(
540 video_frame_provider_client_.get());
541 }
542 }
543
544 MockVideoFrameProviderClient* MockClient::GetVideoFrameProviderClient() {
545 return video_frame_provider_client_.get();
546 }
547
548 TEST_F(WebMediaPlayerMSTest, Playing_Normal) {
549 // Workflow:
550 // 1. WMPMS::Load will generate and start content::VideoFrameProvider.
551 // 2. content::VideoFrameProvider will start pushing frames into WMPMS
552 // repeatedly.
553 // 3. On WMPMS receiving the first frame, a WebLayer will be created.
554 // 4. The WebLayer will call WMPMSCompositor::SetVideoFrameProviderClient,
555 // which in turn will trigger cc::VideoFrameProviderClient::StartRendering.
556 // 5. Then cc::VideoFrameProviderClient will start calling
557 // WMPMSCompositor::UpdateCurrentFrame, GetCurrentFrame for rendering
558 // repeatedly.
559 // 6. When WMPSMS::pause gets called, it should trigger
560 // content::VideoFrameProvider::Pause, and then the provider will stop
561 // pushing frames into WMPMS, but instead digesting them; simultanously, it
562 // should call cc::VideoFrameProviderClient::StopRendering, so the client
563 // will stop asking frames from WMPMSCompositor.
564 // 7. When WMPMS::play gets called, evething paused in step 6 should be
565 // resumed.
566 MockVideoFrameProvider* provider = LoadAndGetFrameProvider(true);
567
568 provider->QueueFrames(
569 "0 33 66 100 133 166 200 233 266 300 333 366 400 433 "
570 "466 500 533 566 600");
571
572 EXPECT_CALL(mock_cb_, StartRendering());
573 EXPECT_CALL(mock_cb_,
574 ReadyStateChanged(blink::WebMediaPlayer::ReadyStateHaveMetadata));
575 EXPECT_CALL(mock_cb_, ReadyStateChanged(
576 blink::WebMediaPlayer::ReadyStateHaveEnoughData));
577 message_loop_controller_.RunAndWaitForStatus(
578 media::PipelineStatus::PIPELINE_OK);
579 }
580
581 TEST_F(WebMediaPlayerMSTest, Playing_ErrorFrame) {
582 MockVideoFrameProvider* provider = LoadAndGetFrameProvider(false);
583
584 provider->QueueFrames(
585 "0 33 66 100 133 166 200 233 266 300 333 366 400 433 "
586 "466 500 533 566 600 error");
587
588 EXPECT_CALL(mock_cb_, StartRendering());
589 EXPECT_CALL(mock_cb_,
590 ReadyStateChanged(blink::WebMediaPlayer::ReadyStateHaveMetadata));
591 EXPECT_CALL(mock_cb_, ReadyStateChanged(
592 blink::WebMediaPlayer::ReadyStateHaveEnoughData));
593 EXPECT_CALL(mock_cb_, NetworkStateChanged(
594 blink::WebMediaPlayer::NetworkStateFormatError));
595 message_loop_controller_.RunAndWaitForStatus(
596 media::PipelineStatus::PIPELINE_ERROR_NETWORK);
597 }
598
599 TEST_F(WebMediaPlayerMSTest, PlayThenPause) {
600 MockVideoFrameProvider* provider = LoadAndGetFrameProvider(false);
601
602 provider->QueueFrames(
603 "0 33 66 100 133 brake 166 200 233 266 300 333 366 400 "
604 "433 466 500 533 566 600");
605
606 EXPECT_CALL(mock_cb_, StartRendering());
607 EXPECT_CALL(mock_cb_,
608 ReadyStateChanged(blink::WebMediaPlayer::ReadyStateHaveMetadata));
609 EXPECT_CALL(mock_cb_, ReadyStateChanged(
610 blink::WebMediaPlayer::ReadyStateHaveEnoughData));
611 // Rendering will be "paused" at the TestBrake.
612 message_loop_controller_.RunAndWaitForStatus(
613 media::PipelineStatus::PIPELINE_OK);
614 mock_cb_.VerifyAndClearExpectations();
615
616 // Here No more rendering. 1. Render should not be called, 2. Frame freeze.
617 EXPECT_CALL(mock_cb_, StopRendering());
618 player_.pause();
619 cc::VideoFrameProvider* compositor = GetCompositorForTest();
620 auto prev_frame = compositor->GetCurrentFrame();
621 message_loop_controller_.RunAndWaitForStatus(
622 media::PipelineStatus::PIPELINE_OK);
623 auto after_frame = compositor->GetCurrentFrame();
624 EXPECT_EQ(prev_frame->timestamp(), after_frame->timestamp());
625 }
626
627 TEST_F(WebMediaPlayerMSTest, PlayThenPauseThenPlay) {
628 MockVideoFrameProvider* provider = LoadAndGetFrameProvider(false);
629
630 provider->QueueFrames(
631 "0 33 66 100 133 brake 166 200 233 266 300 333 366 400 "
632 "433 brake 466 500 533 566 600");
633
634 EXPECT_CALL(mock_cb_, StartRendering());
635 EXPECT_CALL(mock_cb_,
636 ReadyStateChanged(blink::WebMediaPlayer::ReadyStateHaveMetadata));
637 EXPECT_CALL(mock_cb_, ReadyStateChanged(
638 blink::WebMediaPlayer::ReadyStateHaveEnoughData));
639 // Rendering will be "paused" at the TestBrake.
640 message_loop_controller_.RunAndWaitForStatus(
641 media::PipelineStatus::PIPELINE_OK);
642 mock_cb_.VerifyAndClearExpectations();
643
644 // Here No more rendering. 1. Render should not be called, 2. Frame freeze.
645 EXPECT_CALL(mock_cb_, StopRendering());
646 player_.pause();
647 cc::VideoFrameProvider* compositor = GetCompositorForTest();
648 auto prev_frame = compositor->GetCurrentFrame();
649 message_loop_controller_.RunAndWaitForStatus(
650 media::PipelineStatus::PIPELINE_OK);
651 auto after_frame = compositor->GetCurrentFrame();
652 EXPECT_EQ(prev_frame->timestamp(), after_frame->timestamp());
653 mock_cb_.VerifyAndClearExpectations();
654
655 // We resume the player
656 EXPECT_CALL(mock_cb_, StartRendering());
657 player_.play();
658 prev_frame = compositor->GetCurrentFrame();
659 message_loop_controller_.RunAndWaitForStatus(
660 media::PipelineStatus::PIPELINE_OK);
661 after_frame = compositor->GetCurrentFrame();
662 EXPECT_NE(prev_frame->timestamp(), after_frame->timestamp());
663 }
664
665 TEST_F(WebMediaPlayerMSTest, BackgroudRendering) {
666 MockVideoFrameProvider* provider = LoadAndGetFrameProvider(true);
667
668 provider->QueueFrames(
669 "0 33 66 100 133 brake 166 200 233 266 300 333 366 400 "
670 "433 brake 466 500 533 566 600");
671
672 EXPECT_CALL(mock_cb_, StartRendering());
673 EXPECT_CALL(mock_cb_,
674 ReadyStateChanged(blink::WebMediaPlayer::ReadyStateHaveMetadata));
675 EXPECT_CALL(mock_cb_, ReadyStateChanged(
676 blink::WebMediaPlayer::ReadyStateHaveEnoughData));
677 // Rendering will be "paused" at the TestBrake.
678 message_loop_controller_.RunAndWaitForStatus(
679 media::PipelineStatus::PIPELINE_OK);
680 mock_cb_.VerifyAndClearExpectations();
681
682 // Switch to background rendering, expect rendering to continue
683 MockVideoFrameProviderClient* client = client_.GetVideoFrameProviderClient();
684 client->SetBackgroundRendering(true);
685 cc::VideoFrameProvider* compositor = GetCompositorForTest();
686 auto prev_frame = compositor->GetCurrentFrame();
687 message_loop_controller_.RunAndWaitForStatus(
688 media::PipelineStatus::PIPELINE_OK);
689 auto after_frame = compositor->GetCurrentFrame();
690 EXPECT_NE(prev_frame->timestamp(), after_frame->timestamp());
691
692 // Switch to foreground rendering
693 client->SetBackgroundRendering(false);
694 prev_frame = compositor->GetCurrentFrame();
695 message_loop_controller_.RunAndWaitForStatus(
696 media::PipelineStatus::PIPELINE_OK);
697 after_frame = compositor->GetCurrentFrame();
698 EXPECT_NE(prev_frame->timestamp(), after_frame->timestamp());
699 }
700 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698