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

Side by Side Diff: media/mojo/clients/mojo_renderer_unittest.cc

Issue 2239243002: Interpolate media time for mojo rendering pipeline. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: moves media-time clamping to PipelineImpl Created 4 years, 3 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/mojo/clients/mojo_renderer.cc ('k') | media/mojo/interfaces/renderer.mojom » ('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 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "base/bind.h" 7 #include "base/bind.h"
8 #include "base/macros.h" 8 #include "base/macros.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
11 #include "base/threading/platform_thread.h" 11 #include "base/threading/platform_thread.h"
12 #include "base/timer/elapsed_timer.h"
12 #include "media/base/audio_renderer_sink.h" 13 #include "media/base/audio_renderer_sink.h"
13 #include "media/base/cdm_config.h" 14 #include "media/base/cdm_config.h"
14 #include "media/base/cdm_context.h" 15 #include "media/base/cdm_context.h"
15 #include "media/base/gmock_callback_support.h" 16 #include "media/base/gmock_callback_support.h"
16 #include "media/base/mock_filters.h" 17 #include "media/base/mock_filters.h"
17 #include "media/base/test_helpers.h" 18 #include "media/base/test_helpers.h"
18 #include "media/base/video_renderer_sink.h" 19 #include "media/base/video_renderer_sink.h"
19 #include "media/cdm/default_cdm_factory.h" 20 #include "media/cdm/default_cdm_factory.h"
20 #include "media/mojo/clients/mojo_renderer.h" 21 #include "media/mojo/clients/mojo_renderer.h"
21 #include "media/mojo/common/media_type_converters.h" 22 #include "media/mojo/common/media_type_converters.h"
22 #include "media/mojo/interfaces/content_decryption_module.mojom.h" 23 #include "media/mojo/interfaces/content_decryption_module.mojom.h"
23 #include "media/mojo/interfaces/renderer.mojom.h" 24 #include "media/mojo/interfaces/renderer.mojom.h"
24 #include "media/mojo/services/mojo_cdm_service.h" 25 #include "media/mojo/services/mojo_cdm_service.h"
25 #include "media/mojo/services/mojo_cdm_service_context.h" 26 #include "media/mojo/services/mojo_cdm_service_context.h"
26 #include "media/mojo/services/mojo_renderer_service.h" 27 #include "media/mojo/services/mojo_renderer_service.h"
27 #include "media/renderers/video_overlay_factory.h" 28 #include "media/renderers/video_overlay_factory.h"
28 #include "mojo/public/cpp/bindings/interface_request.h" 29 #include "mojo/public/cpp/bindings/interface_request.h"
29 #include "testing/gtest/include/gtest/gtest.h" 30 #include "testing/gtest/include/gtest/gtest.h"
30 31
31 using ::testing::_; 32 using ::testing::_;
32 using ::testing::DoAll; 33 using ::testing::DoAll;
33 using ::testing::Return; 34 using ::testing::Return;
34 using ::testing::SaveArg; 35 using ::testing::SaveArg;
35 using ::testing::StrictMock; 36 using ::testing::StrictMock;
36 37
37 namespace media { 38 namespace media {
38 39
40 namespace {
39 const int64_t kStartPlayingTimeInMs = 100; 41 const int64_t kStartPlayingTimeInMs = 100;
40 const char kClearKeyKeySystem[] = "org.w3.clearkey"; 42 const char kClearKeyKeySystem[] = "org.w3.clearkey";
41 43
42 ACTION_P2(SetError, renderer_client, error) { 44 ACTION_P2(GetMediaTime, start_time, elapsed_timer) {
43 renderer_client->OnError(error); 45 return start_time + elapsed_timer->Elapsed();
44 } 46 }
45 47
48 void WaitFor(base::TimeDelta duration) {
49 base::RunLoop run_loop;
50 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
51 FROM_HERE, run_loop.QuitClosure(), duration);
52 run_loop.Run();
53 }
54 } // namespace
55
46 class MojoRendererTest : public ::testing::Test { 56 class MojoRendererTest : public ::testing::Test {
47 public: 57 public:
48 MojoRendererTest() { 58 MojoRendererTest() {
49 std::unique_ptr<StrictMock<MockRenderer>> mock_renderer( 59 std::unique_ptr<StrictMock<MockRenderer>> mock_renderer(
50 new StrictMock<MockRenderer>()); 60 new StrictMock<MockRenderer>());
51 mock_renderer_ = mock_renderer.get(); 61 mock_renderer_ = mock_renderer.get();
52 62
53 mojom::RendererPtr remote_renderer; 63 mojom::RendererPtr remote_renderer;
54 64
55 mojo_renderer_service_ = new MojoRendererService( 65 mojo_renderer_service_ = new MojoRendererService(
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after
319 329
320 TEST_F(MojoRendererTest, StartPlayingFrom) { 330 TEST_F(MojoRendererTest, StartPlayingFrom) {
321 Initialize(); 331 Initialize();
322 Play(); 332 Play();
323 } 333 }
324 334
325 TEST_F(MojoRendererTest, GetMediaTime) { 335 TEST_F(MojoRendererTest, GetMediaTime) {
326 Initialize(); 336 Initialize();
327 EXPECT_EQ(base::TimeDelta(), mojo_renderer_->GetMediaTime()); 337 EXPECT_EQ(base::TimeDelta(), mojo_renderer_->GetMediaTime());
328 338
329 Play(); 339 const base::TimeDelta kSleepTime = base::TimeDelta::FromMilliseconds(500);
340 const base::TimeDelta kStartTime =
341 base::TimeDelta::FromMilliseconds(kStartPlayingTimeInMs);
330 342
331 // Time is updated periodically with a short delay. 343 // Media time should not advance since playback rate is 0.
332 const base::TimeDelta kUpdatedTime = base::TimeDelta::FromMilliseconds(500); 344 EXPECT_CALL(*mock_renderer_, SetPlaybackRate(0));
345 EXPECT_CALL(*mock_renderer_, StartPlayingFrom(kStartTime));
333 EXPECT_CALL(*mock_renderer_, GetMediaTime()) 346 EXPECT_CALL(*mock_renderer_, GetMediaTime())
334 .WillRepeatedly(Return(kUpdatedTime)); 347 .WillRepeatedly(Return(kStartTime));
335 base::PlatformThread::Sleep(base::TimeDelta::FromMilliseconds(100)); 348 mojo_renderer_->SetPlaybackRate(0);
336 base::RunLoop().RunUntilIdle(); 349 mojo_renderer_->StartPlayingFrom(kStartTime);
337 EXPECT_EQ(kUpdatedTime, mojo_renderer_->GetMediaTime()); 350 WaitFor(kSleepTime);
351 EXPECT_EQ(kStartTime, mojo_renderer_->GetMediaTime());
352
353 // Media time should now advance since playback rate is > 0.
354 std::unique_ptr<base::ElapsedTimer> elapsed_timer(new base::ElapsedTimer);
355 EXPECT_CALL(*mock_renderer_, SetPlaybackRate(1.0));
356 EXPECT_CALL(*mock_renderer_, GetMediaTime())
357 .WillRepeatedly(GetMediaTime(kStartTime, elapsed_timer.get()));
358 mojo_renderer_->SetPlaybackRate(1.0);
359 WaitFor(kSleepTime);
360 EXPECT_GT(mojo_renderer_->GetMediaTime(), kStartTime);
361
362 // Flushing should pause media-time updates.
363 EXPECT_CALL(*mock_renderer_, Flush(_)).WillOnce(RunClosure<0>());
364 Flush();
365 base::TimeDelta pause_time = mojo_renderer_->GetMediaTime();
366 EXPECT_GT(pause_time, kStartTime);
367 WaitFor(kSleepTime);
368 EXPECT_EQ(pause_time, mojo_renderer_->GetMediaTime());
369 Destroy();
338 } 370 }
339 371
340 TEST_F(MojoRendererTest, OnEnded) { 372 TEST_F(MojoRendererTest, OnEnded) {
341 Initialize(); 373 Initialize();
342 Play(); 374 Play();
343 375
344 EXPECT_CALL(renderer_client_, OnEnded()).Times(1); 376 EXPECT_CALL(renderer_client_, OnEnded()).Times(1);
345 remote_renderer_client_->OnEnded(); 377 remote_renderer_client_->OnEnded();
346 base::RunLoop().RunUntilIdle(); 378 base::RunLoop().RunUntilIdle();
347 } 379 }
(...skipping 16 matching lines...) Expand all
364 .WillRepeatedly(RunCallback<1>(true)); 396 .WillRepeatedly(RunCallback<1>(true));
365 EXPECT_CALL(*this, OnCdmAttached(false)); 397 EXPECT_CALL(*this, OnCdmAttached(false));
366 mojo_renderer_->SetCdm( 398 mojo_renderer_->SetCdm(
367 &cdm_context_, 399 &cdm_context_,
368 base::Bind(&MojoRendererTest::OnCdmAttached, base::Unretained(this))); 400 base::Bind(&MojoRendererTest::OnCdmAttached, base::Unretained(this)));
369 Destroy(); 401 Destroy();
370 } 402 }
371 403
372 TEST_F(MojoRendererTest, Destroy_PendingSetCdm) { 404 TEST_F(MojoRendererTest, Destroy_PendingSetCdm) {
373 Initialize(); 405 Initialize();
406
374 EXPECT_CALL(*mock_renderer_, Flush(_)).WillRepeatedly(RunClosure<0>()); 407 EXPECT_CALL(*mock_renderer_, Flush(_)).WillRepeatedly(RunClosure<0>());
375 EXPECT_CALL(*this, OnFlushed()); 408 EXPECT_CALL(*this, OnFlushed());
376 mojo_renderer_->Flush( 409 mojo_renderer_->Flush(
377 base::Bind(&MojoRendererTest::OnFlushed, base::Unretained(this))); 410 base::Bind(&MojoRendererTest::OnFlushed, base::Unretained(this)));
378 Destroy(); 411 Destroy();
379 } 412 }
380 413
381 // TODO(xhwang): Add more tests on OnError. For example, ErrorDuringFlush, 414 // TODO(xhwang): Add more tests on OnError. For example, ErrorDuringFlush,
382 // ErrorAfterFlush etc. 415 // ErrorAfterFlush etc.
383 416
384 TEST_F(MojoRendererTest, ErrorDuringPlayback) { 417 TEST_F(MojoRendererTest, ErrorDuringPlayback) {
385 Initialize(); 418 Initialize();
386 419
387 EXPECT_CALL(renderer_client_, OnError(PIPELINE_ERROR_DECODE)).Times(1); 420 EXPECT_CALL(renderer_client_, OnError(PIPELINE_ERROR_DECODE)).Times(1);
388 421
389 Play(); 422 Play();
390 remote_renderer_client_->OnError(PIPELINE_ERROR_DECODE); 423 remote_renderer_client_->OnError(PIPELINE_ERROR_DECODE);
391 base::RunLoop().RunUntilIdle(); 424 base::RunLoop().RunUntilIdle();
392 425
393 EXPECT_CALL(*mock_renderer_, SetPlaybackRate(0.0)).Times(1); 426 EXPECT_CALL(*mock_renderer_, SetPlaybackRate(0.0)).Times(1);
394 mojo_renderer_->SetPlaybackRate(0.0); 427 mojo_renderer_->SetPlaybackRate(0.0);
395 Flush(); 428 Flush();
396 } 429 }
397 430
398 } // namespace media 431 } // namespace media
OLDNEW
« no previous file with comments | « media/mojo/clients/mojo_renderer.cc ('k') | media/mojo/interfaces/renderer.mojom » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698