OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 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/service_factory_impl.h" | 5 #include "media/mojo/services/service_factory_impl.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "media/base/cdm_factory.h" | 8 #include "media/base/cdm_factory.h" |
9 #include "media/base/media_log.h" | 9 #include "media/base/media_log.h" |
10 #include "media/base/renderer_factory.h" | 10 #include "media/base/renderer_factory.h" |
11 #include "media/mojo/services/mojo_cdm_service.h" | 11 #include "media/mojo/services/mojo_cdm_service.h" |
12 #include "media/mojo/services/mojo_media_client.h" | 12 #include "media/mojo/services/mojo_media_client.h" |
13 #include "media/mojo/services/mojo_renderer_service.h" | 13 #include "media/mojo/services/mojo_renderer_service.h" |
14 #include "mojo/application/public/cpp/app_lifetime_helper.h" | 14 #include "mojo/application/public/cpp/app_lifetime_helper.h" |
| 15 #include "mojo/application/public/cpp/application_connection.h" |
| 16 #include "mojo/application/public/cpp/application_impl.h" |
15 #include "mojo/application/public/interfaces/service_provider.mojom.h" | 17 #include "mojo/application/public/interfaces/service_provider.mojom.h" |
| 18 #include "mojo/common/weak_binding_set.h" |
16 | 19 |
17 namespace media { | 20 namespace media { |
18 | 21 |
| 22 struct ServiceFactoryImpl::ServiceBundle { |
| 23 typedef base::Callback<void(const std::string&)> EmptyCallback; |
| 24 ServiceBundle(scoped_ptr<mojo::AppRefCount> refcount, |
| 25 const std::string& url, |
| 26 const EmptyCallback& cb) |
| 27 : app_refcount(std::move(refcount)), app_url(url), empty_cb(cb) { |
| 28 cdm_bindings.set_connection_error_handler( |
| 29 [this]() { OnConnectionError(); }); |
| 30 renderer_bindings.set_connection_error_handler( |
| 31 [this]() { OnConnectionError(); }); |
| 32 } |
| 33 ~ServiceBundle() {} |
| 34 void OnConnectionError() { |
| 35 if (cdm_bindings.empty() && renderer_bindings.empty()) |
| 36 empty_cb.Run(app_url); |
| 37 } |
| 38 |
| 39 scoped_ptr<mojo::AppRefCount> app_refcount; |
| 40 std::string app_url; |
| 41 EmptyCallback empty_cb; |
| 42 MojoCdmServiceContext cdm_service_context; |
| 43 mojo::WeakBindingSet<interfaces::ContentDecryptionModule> cdm_bindings; |
| 44 mojo::WeakBindingSet<interfaces::Renderer> renderer_bindings; |
| 45 }; |
| 46 |
19 ServiceFactoryImpl::ServiceFactoryImpl( | 47 ServiceFactoryImpl::ServiceFactoryImpl( |
20 mojo::InterfaceRequest<interfaces::ServiceFactory> request, | 48 scoped_ptr<MojoMediaClient> mojo_media_client, |
21 mojo::ServiceProvider* service_provider, | 49 scoped_refptr<MediaLog> media_log) |
22 scoped_refptr<MediaLog> media_log, | 50 : app_(nullptr), |
23 scoped_ptr<mojo::AppRefCount> parent_app_refcount, | 51 mojo_media_client_(std::move(mojo_media_client)), |
24 MojoMediaClient* mojo_media_client) | 52 media_log_(media_log) { |
25 : binding_(this, std::move(request)), | |
26 service_provider_(service_provider), | |
27 media_log_(media_log), | |
28 parent_app_refcount_(std::move(parent_app_refcount)), | |
29 mojo_media_client_(mojo_media_client) { | |
30 DVLOG(1) << __FUNCTION__; | 53 DVLOG(1) << __FUNCTION__; |
31 } | 54 } |
32 | 55 |
33 ServiceFactoryImpl::~ServiceFactoryImpl() { | 56 ServiceFactoryImpl::~ServiceFactoryImpl() { |
34 DVLOG(1) << __FUNCTION__; | 57 DVLOG(1) << __FUNCTION__; |
35 } | 58 } |
36 | 59 |
37 // interfaces::ServiceFactory implementation. | 60 void ServiceFactoryImpl::Initialize(mojo::ApplicationImpl* app) { |
38 void ServiceFactoryImpl::CreateRenderer( | 61 app_ = app; |
| 62 mojo_media_client_->Initialize(); |
| 63 } |
| 64 |
| 65 void ServiceFactoryImpl::Create( |
| 66 mojo::ApplicationConnection* connection, |
39 mojo::InterfaceRequest<interfaces::Renderer> request) { | 67 mojo::InterfaceRequest<interfaces::Renderer> request) { |
40 // The created object is owned by the pipe. | |
41 scoped_refptr<base::SingleThreadTaskRunner> task_runner( | 68 scoped_refptr<base::SingleThreadTaskRunner> task_runner( |
42 base::MessageLoop::current()->task_runner()); | 69 base::MessageLoop::current()->task_runner()); |
43 scoped_refptr<AudioRendererSink> audio_renderer_sink = | 70 scoped_refptr<AudioRendererSink> audio_renderer_sink = |
44 mojo_media_client_->CreateAudioRendererSink(); | 71 mojo_media_client_->CreateAudioRendererSink(); |
45 scoped_ptr<VideoRendererSink> video_renderer_sink = | 72 scoped_ptr<VideoRendererSink> video_renderer_sink = |
46 mojo_media_client_->CreateVideoRendererSink(task_runner); | 73 mojo_media_client_->CreateVideoRendererSink(task_runner); |
47 scoped_ptr<Renderer> renderer = GetRendererFactory()->CreateRenderer( | 74 scoped_ptr<Renderer> renderer = GetRendererFactory()->CreateRenderer( |
48 task_runner, task_runner, audio_renderer_sink.get(), | 75 task_runner, task_runner, audio_renderer_sink.get(), |
49 video_renderer_sink.get()); | 76 video_renderer_sink.get()); |
50 | 77 |
51 new MojoRendererService(cdm_service_context_.GetWeakPtr(), | 78 ServiceBundle* bundle = |
52 std::move(renderer), std::move(request)); | 79 GetOrCreateServiceBundle(connection->GetRemoteApplicationURL()); |
| 80 MojoRendererService* renderer_service = new MojoRendererService( |
| 81 bundle->cdm_service_context.GetWeakPtr(), std::move(renderer)); |
| 82 bundle->renderer_bindings.AddBinding(renderer_service, std::move(request)); |
53 } | 83 } |
54 | 84 |
55 void ServiceFactoryImpl::CreateCdm( | 85 void ServiceFactoryImpl::Create( |
| 86 mojo::ApplicationConnection* connection, |
56 mojo::InterfaceRequest<interfaces::ContentDecryptionModule> request) { | 87 mojo::InterfaceRequest<interfaces::ContentDecryptionModule> request) { |
57 // The created object is owned by the pipe. | 88 ServiceBundle* bundle = |
58 new MojoCdmService(cdm_service_context_.GetWeakPtr(), service_provider_, | 89 GetOrCreateServiceBundle(connection->GetRemoteApplicationURL()); |
59 GetCdmFactory(), std::move(request)); | 90 MojoCdmService* cdm_service = |
| 91 new MojoCdmService(bundle->cdm_service_context.GetWeakPtr(), |
| 92 GetCdmFactory(connection->GetServiceProvider())); |
| 93 bundle->cdm_bindings.AddBinding(cdm_service, std::move(request)); |
| 94 } |
| 95 |
| 96 ServiceFactoryImpl::ServiceBundle* ServiceFactoryImpl::GetOrCreateServiceBundle( |
| 97 const std::string& url) { |
| 98 auto iter = service_bundle_map_.find(url); |
| 99 if (iter != service_bundle_map_.end()) |
| 100 return iter->second.get(); |
| 101 |
| 102 auto ret = service_bundle_map_.insert(std::make_pair( |
| 103 url, |
| 104 new ServiceBundle(app_->app_lifetime_helper()->CreateAppRefCount(), url, |
| 105 base::Bind(&ServiceFactoryImpl::OnServiceBundleEmpty, |
| 106 base::Unretained(this))))); |
| 107 return ret.first->second.get(); |
| 108 } |
| 109 |
| 110 void ServiceFactoryImpl::OnServiceBundleEmpty(const std::string& url) { |
| 111 auto iter = service_bundle_map_.find(url); |
| 112 DCHECK(iter != service_bundle_map_.end()); |
| 113 DCHECK(iter->second->cdm_bindings.empty()); |
| 114 DCHECK(iter->second->renderer_bindings.empty()); |
| 115 service_bundle_map_.erase(iter); |
60 } | 116 } |
61 | 117 |
62 RendererFactory* ServiceFactoryImpl::GetRendererFactory() { | 118 RendererFactory* ServiceFactoryImpl::GetRendererFactory() { |
63 if (!renderer_factory_) | 119 if (!renderer_factory_) |
64 renderer_factory_ = mojo_media_client_->CreateRendererFactory(media_log_); | 120 renderer_factory_ = mojo_media_client_->CreateRendererFactory(media_log_); |
65 return renderer_factory_.get(); | 121 return renderer_factory_.get(); |
66 } | 122 } |
67 | 123 |
68 CdmFactory* ServiceFactoryImpl::GetCdmFactory() { | 124 CdmFactory* ServiceFactoryImpl::GetCdmFactory( |
| 125 mojo::ServiceProvider* service_provider) { |
69 if (!cdm_factory_) | 126 if (!cdm_factory_) |
70 cdm_factory_ = mojo_media_client_->CreateCdmFactory(service_provider_); | 127 cdm_factory_ = mojo_media_client_->CreateCdmFactory(service_provider); |
71 return cdm_factory_.get(); | 128 return cdm_factory_.get(); |
72 } | 129 } |
73 | 130 |
74 } // namespace media | 131 } // namespace media |
OLD | NEW |