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_renderer_service.h" | 5 #include "media/mojo/services/mojo_renderer_service.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/optional.h" | 10 #include "base/optional.h" |
11 #include "media/base/audio_renderer_sink.h" | 11 #include "media/base/audio_renderer_sink.h" |
12 #include "media/base/media_keys.h" | 12 #include "media/base/media_keys.h" |
13 #include "media/base/media_url_demuxer.h" | 13 #include "media/base/media_url_demuxer.h" |
14 #include "media/base/renderer.h" | 14 #include "media/base/renderer.h" |
15 #include "media/base/video_renderer_sink.h" | 15 #include "media/base/video_renderer_sink.h" |
16 #include "media/mojo/services/demuxer_stream_provider_shim.h" | 16 #include "media/mojo/services/demuxer_stream_provider_shim.h" |
17 #include "media/mojo/services/mojo_cdm_service_context.h" | 17 #include "media/mojo/services/mojo_cdm_service_context.h" |
18 | 18 |
19 namespace media { | 19 namespace media { |
20 | 20 |
| 21 namespace { |
| 22 |
| 23 void CloseBindingOnBadMessage(mojo::StrongBindingPtr<mojom::Renderer> binding) { |
| 24 LOG(ERROR) << __func__; |
| 25 DCHECK(binding); |
| 26 binding->Close(); |
| 27 } |
| 28 |
| 29 } // namespace |
| 30 |
21 // Time interval to update media time. | 31 // Time interval to update media time. |
22 const int kTimeUpdateIntervalMs = 50; | 32 const int kTimeUpdateIntervalMs = 50; |
23 | 33 |
24 // static | 34 // static |
25 mojo::StrongBindingPtr<mojom::Renderer> MojoRendererService::Create( | 35 mojo::StrongBindingPtr<mojom::Renderer> MojoRendererService::Create( |
26 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, | 36 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, |
27 scoped_refptr<AudioRendererSink> audio_sink, | 37 scoped_refptr<AudioRendererSink> audio_sink, |
28 std::unique_ptr<VideoRendererSink> video_sink, | 38 std::unique_ptr<VideoRendererSink> video_sink, |
29 std::unique_ptr<media::Renderer> renderer, | 39 std::unique_ptr<media::Renderer> renderer, |
30 InitiateSurfaceRequestCB initiate_surface_request_cb, | 40 InitiateSurfaceRequestCB initiate_surface_request_cb, |
31 mojo::InterfaceRequest<mojom::Renderer> request) { | 41 mojo::InterfaceRequest<mojom::Renderer> request) { |
32 MojoRendererService* service = new MojoRendererService( | 42 MojoRendererService* service = new MojoRendererService( |
33 mojo_cdm_service_context, std::move(audio_sink), std::move(video_sink), | 43 mojo_cdm_service_context, std::move(audio_sink), std::move(video_sink), |
34 std::move(renderer), initiate_surface_request_cb); | 44 std::move(renderer), initiate_surface_request_cb); |
35 | 45 |
36 mojo::StrongBindingPtr<mojom::Renderer> binding = | 46 mojo::StrongBindingPtr<mojom::Renderer> binding = |
37 mojo::MakeStrongBinding<mojom::Renderer>(base::WrapUnique(service), | 47 mojo::MakeStrongBinding<mojom::Renderer>(base::WrapUnique(service), |
38 std::move(request)); | 48 std::move(request)); |
39 | 49 |
40 service->binding_ = binding; | 50 service->set_bad_message_cb(base::Bind(&CloseBindingOnBadMessage, binding)); |
41 | 51 |
42 return binding; | 52 return binding; |
43 } | 53 } |
44 | 54 |
45 MojoRendererService::MojoRendererService( | 55 MojoRendererService::MojoRendererService( |
46 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, | 56 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, |
47 scoped_refptr<AudioRendererSink> audio_sink, | 57 scoped_refptr<AudioRendererSink> audio_sink, |
48 std::unique_ptr<VideoRendererSink> video_sink, | 58 std::unique_ptr<VideoRendererSink> video_sink, |
49 std::unique_ptr<media::Renderer> renderer, | 59 std::unique_ptr<media::Renderer> renderer, |
50 InitiateSurfaceRequestCB initiate_surface_request_cb) | 60 InitiateSurfaceRequestCB initiate_surface_request_cb) |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 | 274 |
265 callback.Run(success); | 275 callback.Run(success); |
266 } | 276 } |
267 | 277 |
268 void MojoRendererService::InitiateScopedSurfaceRequest( | 278 void MojoRendererService::InitiateScopedSurfaceRequest( |
269 const InitiateScopedSurfaceRequestCallback& callback) { | 279 const InitiateScopedSurfaceRequestCallback& callback) { |
270 if (initiate_surface_request_cb_.is_null()) { | 280 if (initiate_surface_request_cb_.is_null()) { |
271 // |renderer_| is likely not of type MediaPlayerRenderer. | 281 // |renderer_| is likely not of type MediaPlayerRenderer. |
272 // This is an unexpected call, and the connection should be closed. | 282 // This is an unexpected call, and the connection should be closed. |
273 mojo::ReportBadMessage("Unexpected call to InitiateScopedSurfaceRequest."); | 283 mojo::ReportBadMessage("Unexpected call to InitiateScopedSurfaceRequest."); |
274 binding_->Close(); | 284 |
| 285 // This may cause |this| to be destructed. |
| 286 DCHECK(!bad_message_cb_.is_null()); |
| 287 bad_message_cb_.Run(); |
275 return; | 288 return; |
276 } | 289 } |
277 | 290 |
278 callback.Run(initiate_surface_request_cb_.Run()); | 291 callback.Run(initiate_surface_request_cb_.Run()); |
279 } | 292 } |
280 } // namespace media | 293 } // namespace media |
OLD | NEW |