OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/mojo/services/mojo_media_application.h" | 5 #include "media/mojo/services/mojo_media_application.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/thread_task_runner_handle.h" | |
8 #include "media/mojo/services/mojo_cdm_service.h" | 9 #include "media/mojo/services/mojo_cdm_service.h" |
9 #include "media/mojo/services/mojo_renderer_service.h" | 10 #include "media/mojo/services/mojo_renderer_service.h" |
10 #include "mojo/application/public/cpp/application_connection.h" | 11 #include "mojo/application/public/cpp/application_connection.h" |
11 #include "mojo/application/public/cpp/application_impl.h" | 12 #include "mojo/application/public/cpp/application_impl.h" |
12 | 13 |
13 namespace media { | 14 namespace media { |
14 | 15 |
15 const char kMojoMediaAppUrl[] = "mojo:media"; | 16 const char kMojoMediaAppUrl[] = "mojo:media"; |
17 const int kIdleTimeoutInSeconds = 30; | |
16 | 18 |
17 // static | 19 // static |
18 GURL MojoMediaApplication::AppUrl() { | 20 GURL MojoMediaApplication::AppUrl() { |
19 return GURL(kMojoMediaAppUrl); | 21 return GURL(kMojoMediaAppUrl); |
20 } | 22 } |
21 | 23 |
22 // static | 24 // static |
23 scoped_ptr<mojo::ApplicationDelegate> MojoMediaApplication::CreateApp() { | 25 scoped_ptr<mojo::ApplicationDelegate> MojoMediaApplication::CreateApp() { |
24 return scoped_ptr<mojo::ApplicationDelegate>(new MojoMediaApplication()); | 26 return scoped_ptr<mojo::ApplicationDelegate>(new MojoMediaApplication()); |
25 } | 27 } |
26 | 28 |
27 MojoMediaApplication::MojoMediaApplication() { | 29 MojoMediaApplication::MojoMediaApplication() { |
28 } | 30 } |
29 | 31 |
30 MojoMediaApplication::~MojoMediaApplication() { | 32 MojoMediaApplication::~MojoMediaApplication() { |
31 } | 33 } |
32 | 34 |
33 void MojoMediaApplication::Initialize(mojo::ApplicationImpl* app) { | 35 void MojoMediaApplication::Initialize(mojo::ApplicationImpl* app) { |
36 app_impl_ = app; | |
sky
2015/06/24 03:03:31
Add to member initializers and set to null.
xhwang
2015/06/26 16:30:07
Added Class Member Initializers.
| |
37 | |
38 // Enable logging. | |
34 logging::LoggingSettings settings; | 39 logging::LoggingSettings settings; |
35 settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; | 40 settings.logging_dest = logging::LOG_TO_SYSTEM_DEBUG_LOG; |
36 logging::InitLogging(settings); | 41 logging::InitLogging(settings); |
37 // Display process ID, thread ID and timestamp in logs. | 42 // Display process ID, thread ID and timestamp in logs. |
38 logging::SetLogItems(true, true, true, false); | 43 logging::SetLogItems(true, true, true, false); |
44 | |
45 StartIdleTimer(); | |
39 } | 46 } |
40 | 47 |
41 bool MojoMediaApplication::ConfigureIncomingConnection( | 48 bool MojoMediaApplication::ConfigureIncomingConnection( |
42 mojo::ApplicationConnection* connection) { | 49 mojo::ApplicationConnection* connection) { |
43 connection->AddService<mojo::ContentDecryptionModule>(this); | 50 connection->AddService<mojo::ContentDecryptionModule>(this); |
44 connection->AddService<mojo::MediaRenderer>(this); | 51 connection->AddService<mojo::MediaRenderer>(this); |
45 return true; | 52 return true; |
46 } | 53 } |
47 | 54 |
48 void MojoMediaApplication::Create( | 55 void MojoMediaApplication::Create( |
49 mojo::ApplicationConnection* connection, | 56 mojo::ApplicationConnection* connection, |
50 mojo::InterfaceRequest<mojo::ContentDecryptionModule> request) { | 57 mojo::InterfaceRequest<mojo::ContentDecryptionModule> request) { |
51 // The created object is owned by the pipe. | 58 // The created object is owned by the pipe. |
52 new MojoCdmService(&cdm_service_context_, request.Pass()); | 59 MojoCdmService* mojo_cdm_service = |
60 new MojoCdmService(&cdm_service_context_, request.Pass()); | |
61 | |
62 // Passing unretained |this| is safe here because the app is guaranteed to | |
63 // outlive all services. | |
64 mojo_cdm_service->set_connection_error_handler(base::Bind( | |
65 &MojoMediaApplication::OnConnectionError, base::Unretained(this))); | |
sky
2015/06/24 03:03:31
I'm not familiar with this code. Who owns mojo_cmd
xhwang
2015/06/25 18:09:52
mojo_cmd_service is owned by the pipe since it use
| |
66 | |
67 active_service_count_++; | |
68 idle_timeout_callback_.Cancel(); | |
53 } | 69 } |
54 | 70 |
55 void MojoMediaApplication::Create( | 71 void MojoMediaApplication::Create( |
56 mojo::ApplicationConnection* connection, | 72 mojo::ApplicationConnection* connection, |
57 mojo::InterfaceRequest<mojo::MediaRenderer> request) { | 73 mojo::InterfaceRequest<mojo::MediaRenderer> request) { |
58 // The created object is owned by the pipe. | 74 // The created object is owned by the pipe. |
59 new MojoRendererService(request.Pass()); | 75 MojoRendererService* mojo_renderer_service = |
76 new MojoRendererService(request.Pass()); | |
77 | |
78 // Passing unretained |this| is safe here because the app is guaranteed to | |
79 // outlive all services. | |
80 mojo_renderer_service->set_connection_error_handler(base::Bind( | |
81 &MojoMediaApplication::OnConnectionError, base::Unretained(this))); | |
82 | |
83 active_service_count_++; | |
84 idle_timeout_callback_.Cancel(); | |
85 } | |
86 | |
87 void MojoMediaApplication::Quit() { | |
88 app_impl_ = nullptr; | |
89 } | |
90 | |
91 void MojoMediaApplication::StartIdleTimer() { | |
92 // Passing unretained |app_impl_| is safe here because |app_impl_| is | |
93 // guaranteed to outlive |this|, and the callback is canceled if |this| is | |
94 // destroyed. | |
95 idle_timeout_callback_.Reset(base::Bind(&mojo::ApplicationImpl::Terminate, | |
96 base::Unretained(app_impl_))); | |
97 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | |
98 FROM_HERE, idle_timeout_callback_.callback(), | |
99 base::TimeDelta::FromSeconds(kIdleTimeoutInSeconds)); | |
100 } | |
101 | |
102 void MojoMediaApplication::OnConnectionError() { | |
103 DCHECK_GT(active_service_count_, 0u); | |
104 active_service_count_--; | |
105 if (active_service_count_ == 0) { | |
106 // If the last service connection has been dropped, kick off an idle timeout | |
107 // to shut ourselves down. | |
108 StartIdleTimer(); | |
109 } | |
60 } | 110 } |
61 | 111 |
62 } // namespace media | 112 } // namespace media |
OLD | NEW |