Chromium Code Reviews| 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 |