OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "media/mojo/services/service_factory_impl.h" | |
6 | |
7 #include "base/logging.h" | |
8 #include "base/threading/thread_task_runner_handle.h" | |
9 #include "media/base/media_log.h" | |
10 #include "media/mojo/services/mojo_media_client.h" | |
11 #include "mojo/public/cpp/bindings/strong_binding.h" | |
12 #include "services/service_manager/public/interfaces/interface_provider.mojom.h" | |
13 | |
14 #if defined(ENABLE_MOJO_AUDIO_DECODER) | |
15 #include "media/mojo/services/mojo_audio_decoder_service.h" | |
16 #endif // defined(ENABLE_MOJO_AUDIO_DECODER) | |
17 | |
18 #if defined(ENABLE_MOJO_VIDEO_DECODER) | |
19 #include "media/mojo/services/mojo_video_decoder_service.h" | |
20 #endif // defined(ENABLE_MOJO_VIDEO_DECODER) | |
21 | |
22 #if defined(ENABLE_MOJO_RENDERER) | |
23 #include "media/base/audio_renderer_sink.h" | |
24 #include "media/base/renderer_factory.h" | |
25 #include "media/base/video_renderer_sink.h" | |
26 #include "media/mojo/services/mojo_renderer_service.h" | |
27 #endif // defined(ENABLE_MOJO_RENDERER) | |
28 | |
29 #if defined(ENABLE_MOJO_CDM) | |
30 #include "media/base/cdm_factory.h" | |
31 #include "media/mojo/services/mojo_cdm_service.h" | |
32 #endif // defined(ENABLE_MOJO_CDM) | |
33 | |
34 namespace media { | |
35 | |
36 ServiceFactoryImpl::ServiceFactoryImpl( | |
37 service_manager::mojom::InterfaceProviderPtr interfaces, | |
38 scoped_refptr<MediaLog> media_log, | |
39 std::unique_ptr<service_manager::ServiceContextRef> connection_ref, | |
40 MojoMediaClient* mojo_media_client) | |
41 : | |
42 #if defined(ENABLE_MOJO_CDM) | |
43 interfaces_(std::move(interfaces)), | |
44 #endif | |
45 media_log_(media_log), | |
46 connection_ref_(std::move(connection_ref)), | |
47 mojo_media_client_(mojo_media_client) { | |
48 DVLOG(1) << __FUNCTION__; | |
49 DCHECK(mojo_media_client_); | |
50 } | |
51 | |
52 ServiceFactoryImpl::~ServiceFactoryImpl() { | |
53 DVLOG(1) << __FUNCTION__; | |
54 } | |
55 | |
56 // mojom::ServiceFactory implementation. | |
57 | |
58 void ServiceFactoryImpl::CreateAudioDecoder( | |
59 mojo::InterfaceRequest<mojom::AudioDecoder> request) { | |
60 #if defined(ENABLE_MOJO_AUDIO_DECODER) | |
61 scoped_refptr<base::SingleThreadTaskRunner> task_runner( | |
62 base::ThreadTaskRunnerHandle::Get()); | |
63 | |
64 std::unique_ptr<AudioDecoder> audio_decoder = | |
65 mojo_media_client_->CreateAudioDecoder(task_runner); | |
66 if (!audio_decoder) { | |
67 LOG(ERROR) << "AudioDecoder creation failed."; | |
68 return; | |
69 } | |
70 | |
71 mojo::MakeStrongBinding( | |
72 base::MakeUnique<MojoAudioDecoderService>( | |
73 cdm_service_context_.GetWeakPtr(), std::move(audio_decoder)), | |
74 std::move(request)); | |
75 #endif // defined(ENABLE_MOJO_AUDIO_DECODER) | |
76 } | |
77 | |
78 void ServiceFactoryImpl::CreateVideoDecoder( | |
79 mojom::VideoDecoderRequest request) { | |
80 #if defined(ENABLE_MOJO_VIDEO_DECODER) | |
81 mojo::MakeStrongBinding( | |
82 base::MakeUnique<MojoVideoDecoderService>(mojo_media_client_), | |
83 std::move(request)); | |
84 #endif // defined(ENABLE_MOJO_VIDEO_DECODER) | |
85 } | |
86 | |
87 void ServiceFactoryImpl::CreateRenderer( | |
88 const std::string& audio_device_id, | |
89 mojo::InterfaceRequest<mojom::Renderer> request) { | |
90 #if defined(ENABLE_MOJO_RENDERER) | |
91 RendererFactory* renderer_factory = GetRendererFactory(); | |
92 if (!renderer_factory) | |
93 return; | |
94 | |
95 scoped_refptr<base::SingleThreadTaskRunner> task_runner( | |
96 base::ThreadTaskRunnerHandle::Get()); | |
97 auto audio_sink = | |
98 mojo_media_client_->CreateAudioRendererSink(audio_device_id); | |
99 auto video_sink = mojo_media_client_->CreateVideoRendererSink(task_runner); | |
100 auto renderer = renderer_factory->CreateRenderer( | |
101 task_runner, task_runner, audio_sink.get(), video_sink.get(), | |
102 RequestSurfaceCB()); | |
103 if (!renderer) { | |
104 LOG(ERROR) << "Renderer creation failed."; | |
105 return; | |
106 } | |
107 | |
108 MojoRendererService::Create( | |
109 cdm_service_context_.GetWeakPtr(), std::move(audio_sink), | |
110 std::move(video_sink), std::move(renderer), | |
111 MojoRendererService::InitiateSurfaceRequestCB(), std::move(request)); | |
112 #endif // defined(ENABLE_MOJO_RENDERER) | |
113 } | |
114 | |
115 void ServiceFactoryImpl::CreateCdm( | |
116 mojo::InterfaceRequest<mojom::ContentDecryptionModule> request) { | |
117 #if defined(ENABLE_MOJO_CDM) | |
118 CdmFactory* cdm_factory = GetCdmFactory(); | |
119 if (!cdm_factory) | |
120 return; | |
121 | |
122 mojo::MakeStrongBinding(base::MakeUnique<MojoCdmService>( | |
123 cdm_service_context_.GetWeakPtr(), cdm_factory), | |
124 std::move(request)); | |
125 #endif // defined(ENABLE_MOJO_CDM) | |
126 } | |
127 | |
128 #if defined(ENABLE_MOJO_RENDERER) | |
129 RendererFactory* ServiceFactoryImpl::GetRendererFactory() { | |
130 if (!renderer_factory_) { | |
131 renderer_factory_ = mojo_media_client_->CreateRendererFactory(media_log_); | |
132 LOG_IF(ERROR, !renderer_factory_) << "RendererFactory not available."; | |
133 } | |
134 return renderer_factory_.get(); | |
135 } | |
136 #endif // defined(ENABLE_MOJO_RENDERER) | |
137 | |
138 #if defined(ENABLE_MOJO_CDM) | |
139 CdmFactory* ServiceFactoryImpl::GetCdmFactory() { | |
140 if (!cdm_factory_) { | |
141 cdm_factory_ = mojo_media_client_->CreateCdmFactory(interfaces_.get()); | |
142 LOG_IF(ERROR, !cdm_factory_) << "CdmFactory not available."; | |
143 } | |
144 return cdm_factory_.get(); | |
145 } | |
146 #endif // defined(ENABLE_MOJO_CDM) | |
147 | |
148 } // namespace media | |
OLD | NEW |