| 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/memory/ptr_util.h" | 10 #include "base/memory/ptr_util.h" |
| 11 #include "base/optional.h" | 11 #include "base/optional.h" |
| 12 #include "media/base/audio_renderer_sink.h" | 12 #include "media/base/audio_renderer_sink.h" |
| 13 #include "media/base/bind_to_current_loop.h" |
| 13 #include "media/base/content_decryption_module.h" | 14 #include "media/base/content_decryption_module.h" |
| 15 #include "media/base/media_log.h" |
| 14 #include "media/base/media_url_demuxer.h" | 16 #include "media/base/media_url_demuxer.h" |
| 15 #include "media/base/renderer.h" | 17 #include "media/base/renderer.h" |
| 16 #include "media/base/video_renderer_sink.h" | 18 #include "media/base/video_renderer_sink.h" |
| 17 #include "media/mojo/services/media_resource_shim.h" | 19 #include "media/mojo/services/media_resource_shim.h" |
| 18 #include "media/mojo/services/mojo_audio_renderer_sink_adapter.h" | 20 #include "media/mojo/services/mojo_audio_renderer_sink_adapter.h" |
| 19 #include "media/mojo/services/mojo_cdm_service_context.h" | 21 #include "media/mojo/services/mojo_cdm_service_context.h" |
| 22 #include "media/mojo/services/mojo_demuxer_service_context.h" |
| 20 #include "media/mojo/services/mojo_video_renderer_sink_adapter.h" | 23 #include "media/mojo/services/mojo_video_renderer_sink_adapter.h" |
| 21 | 24 |
| 22 namespace media { | 25 namespace media { |
| 23 | 26 |
| 24 namespace { | 27 namespace { |
| 25 | 28 |
| 26 void CloseBindingOnBadMessage(mojo::StrongBindingPtr<mojom::Renderer> binding) { | 29 void CloseBindingOnBadMessage(mojo::StrongBindingPtr<mojom::Renderer> binding) { |
| 27 LOG(ERROR) << __func__; | 30 LOG(ERROR) << __func__; |
| 28 DCHECK(binding); | 31 DCHECK(binding); |
| 29 binding->Close(); | 32 binding->Close(); |
| 30 } | 33 } |
| 31 | 34 |
| 32 } // namespace | 35 } // namespace |
| 33 | 36 |
| 34 // Time interval to update media time. | 37 // Time interval to update media time. |
| 35 const int kTimeUpdateIntervalMs = 50; | 38 const int kTimeUpdateIntervalMs = 50; |
| 36 | 39 |
| 37 // static | 40 // static |
| 38 mojo::StrongBindingPtr<mojom::Renderer> MojoRendererService::Create( | 41 mojo::StrongBindingPtr<mojom::Renderer> MojoRendererService::Create( |
| 42 base::WeakPtr<MojoDemuxerServiceContext> mojo_demuxer_service_context, |
| 39 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, | 43 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, |
| 40 scoped_refptr<AudioRendererSink> audio_sink, | 44 scoped_refptr<AudioRendererSink> audio_sink, |
| 41 std::unique_ptr<VideoRendererSink> video_sink, | 45 std::unique_ptr<VideoRendererSink> video_sink, |
| 42 std::unique_ptr<media::Renderer> renderer, | 46 std::unique_ptr<media::Renderer> renderer, |
| 43 InitiateSurfaceRequestCB initiate_surface_request_cb, | 47 InitiateSurfaceRequestCB initiate_surface_request_cb, |
| 44 mojo::InterfaceRequest<mojom::Renderer> request) { | 48 mojo::InterfaceRequest<mojom::Renderer> request) { |
| 45 MojoRendererService* service = new MojoRendererService( | 49 MojoRendererService* service = new MojoRendererService( |
| 46 mojo_cdm_service_context, std::move(audio_sink), std::move(video_sink), | 50 mojo_demuxer_service_context, mojo_cdm_service_context, |
| 47 std::move(renderer), initiate_surface_request_cb); | 51 std::move(audio_sink), std::move(video_sink), std::move(renderer), |
| 52 initiate_surface_request_cb); |
| 48 | 53 |
| 49 mojo::StrongBindingPtr<mojom::Renderer> binding = | 54 mojo::StrongBindingPtr<mojom::Renderer> binding = |
| 50 mojo::MakeStrongBinding<mojom::Renderer>(base::WrapUnique(service), | 55 mojo::MakeStrongBinding<mojom::Renderer>(base::WrapUnique(service), |
| 51 std::move(request)); | 56 std::move(request)); |
| 52 | 57 |
| 53 service->set_bad_message_cb(base::Bind(&CloseBindingOnBadMessage, binding)); | 58 service->set_bad_message_cb(base::Bind(&CloseBindingOnBadMessage, binding)); |
| 54 | 59 |
| 55 return binding; | 60 return binding; |
| 56 } | 61 } |
| 57 | 62 |
| 58 MojoRendererService::MojoRendererService( | 63 MojoRendererService::MojoRendererService( |
| 64 base::WeakPtr<MojoDemuxerServiceContext> mojo_demuxer_service_context, |
| 59 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, | 65 base::WeakPtr<MojoCdmServiceContext> mojo_cdm_service_context, |
| 60 scoped_refptr<AudioRendererSink> audio_sink, | 66 scoped_refptr<AudioRendererSink> audio_sink, |
| 61 std::unique_ptr<VideoRendererSink> video_sink, | 67 std::unique_ptr<VideoRendererSink> video_sink, |
| 62 std::unique_ptr<media::Renderer> renderer, | 68 std::unique_ptr<media::Renderer> renderer, |
| 63 InitiateSurfaceRequestCB initiate_surface_request_cb) | 69 InitiateSurfaceRequestCB initiate_surface_request_cb) |
| 64 : mojo_cdm_service_context_(mojo_cdm_service_context), | 70 : mojo_demuxer_service_context_(mojo_demuxer_service_context), |
| 71 mojo_cdm_service_context_(mojo_cdm_service_context), |
| 65 state_(STATE_UNINITIALIZED), | 72 state_(STATE_UNINITIALIZED), |
| 66 playback_rate_(0), | 73 playback_rate_(0), |
| 74 media_resource_shim_(nullptr), |
| 75 media_url_demuxer_(nullptr), |
| 76 media_resource_(nullptr), |
| 67 audio_sink_(std::move(audio_sink)), | 77 audio_sink_(std::move(audio_sink)), |
| 68 video_sink_(std::move(video_sink)), | 78 video_sink_(std::move(video_sink)), |
| 69 renderer_(std::move(renderer)), | 79 renderer_(std::move(renderer)), |
| 70 initiate_surface_request_cb_(initiate_surface_request_cb), | 80 initiate_surface_request_cb_(initiate_surface_request_cb), |
| 71 weak_factory_(this) { | 81 weak_factory_(this) { |
| 72 DVLOG(1) << __func__; | 82 DVLOG(1) << __func__; |
| 73 DCHECK(renderer_); | 83 DCHECK(renderer_); |
| 74 | 84 |
| 75 weak_this_ = weak_factory_.GetWeakPtr(); | 85 weak_this_ = weak_factory_.GetWeakPtr(); |
| 76 } | 86 } |
| 77 | 87 |
| 78 MojoRendererService::~MojoRendererService() {} | 88 MojoRendererService::~MojoRendererService() {} |
| 79 | 89 |
| 80 void MojoRendererService::Initialize( | 90 void MojoRendererService::Initialize( |
| 81 mojom::RendererClientAssociatedPtrInfo client, | 91 mojom::RendererClientAssociatedPtrInfo client, |
| 92 int32_t demuxer_id, |
| 82 base::Optional<std::vector<mojom::DemuxerStreamPtr>> streams, | 93 base::Optional<std::vector<mojom::DemuxerStreamPtr>> streams, |
| 83 mojom::AudioRendererSinkPtr audio_renderer_sink_ptr, | 94 mojom::AudioRendererSinkPtr audio_renderer_sink_ptr, |
| 84 mojom::VideoRendererSinkPtr video_renderer_sink_ptr, | 95 mojom::VideoRendererSinkPtr video_renderer_sink_ptr, |
| 85 const base::Optional<GURL>& media_url, | 96 const base::Optional<GURL>& media_url, |
| 86 const base::Optional<GURL>& first_party_for_cookies, | 97 const base::Optional<GURL>& first_party_for_cookies, |
| 87 const InitializeCallback& callback) { | 98 const InitializeCallback& callback) { |
| 88 DVLOG(1) << __func__; | 99 DVLOG(1) << __func__; |
| 89 DCHECK_EQ(state_, STATE_UNINITIALIZED); | 100 DCHECK_EQ(state_, STATE_UNINITIALIZED); |
| 90 | 101 |
| 91 client_.Bind(std::move(client)); | 102 client_.Bind(std::move(client)); |
| 92 state_ = STATE_INITIALIZING; | 103 state_ = STATE_INITIALIZING; |
| 93 | 104 |
| 94 if (audio_renderer_sink_ptr) { | 105 if (audio_renderer_sink_ptr) { |
| 95 static_cast<MojoAudioRendererSinkAdapter*>(audio_sink_.get()) | 106 static_cast<MojoAudioRendererSinkAdapter*>(audio_sink_.get()) |
| 96 ->SetClient(std::move(audio_renderer_sink_ptr)); | 107 ->SetClient(std::move(audio_renderer_sink_ptr)); |
| 97 } | 108 } |
| 98 | 109 |
| 99 if (video_renderer_sink_ptr) { | 110 if (video_renderer_sink_ptr) { |
| 100 static_cast<MojoVideoRendererSinkAdapter*>(video_sink_.get()) | 111 static_cast<MojoVideoRendererSinkAdapter*>(video_sink_.get()) |
| 101 ->Initialize(std::move(video_renderer_sink_ptr)); | 112 ->Initialize(std::move(video_renderer_sink_ptr)); |
| 102 } | 113 } |
| 103 | 114 |
| 115 if (demuxer_id != MediaResource::kInvalidRemoteId) { |
| 116 media_resource_ = mojo_demuxer_service_context_->GetDemuxer( |
| 117 demuxer_id, base::Bind(&MojoRendererService::OnDemuxerInitialized, |
| 118 weak_this_, callback)); |
| 119 CHECK(media_resource_); |
| 120 return; |
| 121 } |
| 122 |
| 104 if (media_url == base::nullopt) { | 123 if (media_url == base::nullopt) { |
| 105 DCHECK(streams.has_value()); | 124 DCHECK(streams.has_value()); |
| 106 media_resource_.reset(new MediaResourceShim( | 125 media_resource_shim_.reset(new MediaResourceShim( |
| 107 std::move(*streams), | 126 std::move(*streams), |
| 108 base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback))); | 127 base::Bind(&MojoRendererService::OnStreamReady, weak_this_, callback))); |
| 128 media_resource_ = media_resource_shim_.get(); |
| 109 return; | 129 return; |
| 110 } | 130 } |
| 111 | 131 |
| 112 DCHECK(!media_url.value().is_empty()); | 132 DCHECK(!media_url.value().is_empty()); |
| 113 DCHECK(first_party_for_cookies); | 133 DCHECK(first_party_for_cookies); |
| 114 media_resource_.reset(new MediaUrlDemuxer(nullptr, media_url.value(), | 134 media_url_demuxer_.reset(new MediaUrlDemuxer( |
| 115 first_party_for_cookies.value())); | 135 nullptr, media_url.value(), first_party_for_cookies.value())); |
| 136 media_resource_ = media_url_demuxer_.get(); |
| 116 renderer_->Initialize( | 137 renderer_->Initialize( |
| 117 media_resource_.get(), this, | 138 media_resource_, this, |
| 118 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_, | 139 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_, |
| 119 callback)); | 140 callback)); |
| 120 } | 141 } |
| 121 | 142 |
| 122 void MojoRendererService::Flush(const FlushCallback& callback) { | 143 void MojoRendererService::Flush(const FlushCallback& callback) { |
| 123 DVLOG(2) << __func__; | 144 DVLOG(2) << __func__; |
| 124 DCHECK_EQ(state_, STATE_PLAYING); | 145 DCHECK_EQ(state_, STATE_PLAYING); |
| 125 | 146 |
| 126 state_ = STATE_FLUSHING; | 147 state_ = STATE_FLUSHING; |
| 127 CancelPeriodicMediaTimeUpdates(); | 148 CancelPeriodicMediaTimeUpdates(); |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 212 void MojoRendererService::OnVideoOpacityChange(bool opaque) { | 233 void MojoRendererService::OnVideoOpacityChange(bool opaque) { |
| 213 DVLOG(2) << __func__ << "(" << opaque << ")"; | 234 DVLOG(2) << __func__ << "(" << opaque << ")"; |
| 214 client_->OnVideoOpacityChange(opaque); | 235 client_->OnVideoOpacityChange(opaque); |
| 215 } | 236 } |
| 216 | 237 |
| 217 void MojoRendererService::OnStreamReady( | 238 void MojoRendererService::OnStreamReady( |
| 218 const base::Callback<void(bool)>& callback) { | 239 const base::Callback<void(bool)>& callback) { |
| 219 DCHECK_EQ(state_, STATE_INITIALIZING); | 240 DCHECK_EQ(state_, STATE_INITIALIZING); |
| 220 | 241 |
| 221 renderer_->Initialize( | 242 renderer_->Initialize( |
| 222 media_resource_.get(), this, | 243 media_resource_, this, |
| 223 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_, | 244 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_, |
| 224 callback)); | 245 callback)); |
| 225 } | 246 } |
| 226 | 247 |
| 227 void MojoRendererService::OnRendererInitializeDone( | 248 void MojoRendererService::OnRendererInitializeDone( |
| 228 const base::Callback<void(bool)>& callback, | 249 const InitializeCallback& callback, |
| 229 PipelineStatus status) { | 250 PipelineStatus status) { |
| 230 DVLOG(1) << __func__; | 251 DVLOG(1) << __func__; |
| 231 DCHECK_EQ(state_, STATE_INITIALIZING); | 252 DCHECK_EQ(state_, STATE_INITIALIZING); |
| 232 | 253 |
| 233 if (status != PIPELINE_OK) { | 254 if (status != PIPELINE_OK) { |
| 234 state_ = STATE_ERROR; | 255 state_ = STATE_ERROR; |
| 235 callback.Run(false); | 256 callback.Run(false); |
| 236 return; | 257 return; |
| 237 } | 258 } |
| 238 | 259 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 299 // This may cause |this| to be destructed. | 320 // This may cause |this| to be destructed. |
| 300 DCHECK(!bad_message_cb_.is_null()); | 321 DCHECK(!bad_message_cb_.is_null()); |
| 301 bad_message_cb_.Run(); | 322 bad_message_cb_.Run(); |
| 302 | 323 |
| 303 return; | 324 return; |
| 304 } | 325 } |
| 305 | 326 |
| 306 callback.Run(initiate_surface_request_cb_.Run()); | 327 callback.Run(initiate_surface_request_cb_.Run()); |
| 307 } | 328 } |
| 308 | 329 |
| 330 void MojoRendererService::OnDemuxerInitialized( |
| 331 const InitializeCallback& callback, |
| 332 PipelineStatus status) { |
| 333 if (status != PipelineStatus::PIPELINE_OK) { |
| 334 OnError(status); |
| 335 return; |
| 336 } |
| 337 |
| 338 // for chunk it is called from add id second |
| 339 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( |
| 340 FROM_HERE, base::Bind(&MojoRendererService::InitializeRenderer, |
| 341 weak_this_, callback), |
| 342 base::TimeDelta::FromMilliseconds(100)); |
| 343 } |
| 344 |
| 345 void MojoRendererService::InitializeRenderer( |
| 346 const InitializeCallback& callback) { |
| 347 renderer_->Initialize( |
| 348 media_resource_, this, |
| 349 base::Bind(&MojoRendererService::OnRendererInitializeDone, weak_this_, |
| 350 callback)); |
| 351 } |
| 352 |
| 309 } // namespace media | 353 } // namespace media |
| OLD | NEW |