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

Side by Side Diff: media/mojo/services/service_factory_impl.cc

Issue 1541943002: Delete media::Interfaces::ServiceFactory. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add service bundle Created 5 years 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/services/service_factory_impl.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
OLDNEW
« no previous file with comments | « media/mojo/services/service_factory_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698