| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/remoting/remote_renderer_impl.h" | 5 #include "media/remoting/remote_renderer_impl.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <utility> | 8 #include <utility> |
| 9 | 9 |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 17 matching lines...) Expand all Loading... |
| 28 VideoRendererSink* video_renderer_sink) | 28 VideoRendererSink* video_renderer_sink) |
| 29 : state_(STATE_UNINITIALIZED), | 29 : state_(STATE_UNINITIALIZED), |
| 30 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 30 main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
| 31 media_task_runner_(std::move(media_task_runner)), | 31 media_task_runner_(std::move(media_task_runner)), |
| 32 demuxer_stream_provider_(nullptr), | 32 demuxer_stream_provider_(nullptr), |
| 33 client_(nullptr), | 33 client_(nullptr), |
| 34 remoting_renderer_controller_(remoting_renderer_controller), | 34 remoting_renderer_controller_(remoting_renderer_controller), |
| 35 rpc_broker_(remoting_renderer_controller_->GetRpcBroker()), | 35 rpc_broker_(remoting_renderer_controller_->GetRpcBroker()), |
| 36 rpc_handle_(rpc_broker_->GetUniqueHandle()), | 36 rpc_handle_(rpc_broker_->GetUniqueHandle()), |
| 37 remote_renderer_handle_(remoting::kInvalidHandle), | 37 remote_renderer_handle_(remoting::kInvalidHandle), |
| 38 interstitial_ui_(video_renderer_sink, | 38 video_renderer_sink_(video_renderer_sink), |
| 39 remoting_renderer_controller->pipeline_metadata()), | |
| 40 weak_factory_(this) { | 39 weak_factory_(this) { |
| 41 VLOG(2) << __func__; | 40 VLOG(2) << __func__; |
| 42 // The constructor is running on the main thread. | 41 // The constructor is running on the main thread. |
| 43 DCHECK(remoting_renderer_controller); | 42 DCHECK(remoting_renderer_controller_); |
| 44 | 43 remoting_renderer_controller_->SetShowInterstitialCallback( |
| 45 UpdateInterstitial(); | 44 base::Bind(&RemoteRendererImpl::RequestUpdateInterstitialOnMainThread, |
| 45 media_task_runner_, weak_factory_.GetWeakPtr())); |
| 46 | 46 |
| 47 const remoting::RpcBroker::ReceiveMessageCallback receive_callback = | 47 const remoting::RpcBroker::ReceiveMessageCallback receive_callback = |
| 48 base::Bind(&RemoteRendererImpl::OnMessageReceivedOnMainThread, | 48 base::Bind(&RemoteRendererImpl::OnMessageReceivedOnMainThread, |
| 49 media_task_runner_, weak_factory_.GetWeakPtr()); | 49 media_task_runner_, weak_factory_.GetWeakPtr()); |
| 50 rpc_broker_->RegisterMessageReceiverCallback(rpc_handle_, receive_callback); | 50 rpc_broker_->RegisterMessageReceiverCallback(rpc_handle_, receive_callback); |
| 51 } | 51 } |
| 52 | 52 |
| 53 RemoteRendererImpl::~RemoteRendererImpl() { | 53 RemoteRendererImpl::~RemoteRendererImpl() { |
| 54 VLOG(2) << __func__; | 54 VLOG(2) << __func__; |
| 55 DCHECK(media_task_runner_->BelongsToCurrentThread()); | 55 DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| 56 |
| 57 UpdateInterstitial(interstitial_background_, canvas_size_, |
| 58 RemotingInterstitialType::BETWEEN_SESSIONS); |
| 59 |
| 60 // Post task on main thread to unset the interstial callback. |
| 61 main_task_runner_->PostTask( |
| 62 FROM_HERE, |
| 63 base::Bind(&RemotingRendererController::SetShowInterstitialCallback, |
| 64 remoting_renderer_controller_, |
| 65 RemotingRendererController::ShowInterstitialCallback())); |
| 66 |
| 56 // Post task on main thread to unregister message receiver. | 67 // Post task on main thread to unregister message receiver. |
| 57 main_task_runner_->PostTask( | 68 main_task_runner_->PostTask( |
| 58 FROM_HERE, | 69 FROM_HERE, |
| 59 base::Bind(&remoting::RpcBroker::UnregisterMessageReceiverCallback, | 70 base::Bind(&remoting::RpcBroker::UnregisterMessageReceiverCallback, |
| 60 rpc_broker_, rpc_handle_)); | 71 rpc_broker_, rpc_handle_)); |
| 61 } | 72 } |
| 62 | 73 |
| 63 void RemoteRendererImpl::Initialize( | 74 void RemoteRendererImpl::Initialize( |
| 64 DemuxerStreamProvider* demuxer_stream_provider, | 75 DemuxerStreamProvider* demuxer_stream_provider, |
| 65 media::RendererClient* client, | 76 media::RendererClient* client, |
| (...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 590 void RemoteRendererImpl::OnFatalError(PipelineStatus error) { | 601 void RemoteRendererImpl::OnFatalError(PipelineStatus error) { |
| 591 DCHECK(media_task_runner_->BelongsToCurrentThread()); | 602 DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| 592 DCHECK_NE(PIPELINE_OK, error) << "PIPELINE_OK isn't an error!"; | 603 DCHECK_NE(PIPELINE_OK, error) << "PIPELINE_OK isn't an error!"; |
| 593 | 604 |
| 594 // An error has already been delivered. | 605 // An error has already been delivered. |
| 595 if (state_ == STATE_ERROR) | 606 if (state_ == STATE_ERROR) |
| 596 return; | 607 return; |
| 597 | 608 |
| 598 VLOG(2) << __func__ << " with PipelineStatus error=" << error; | 609 VLOG(2) << __func__ << " with PipelineStatus error=" << error; |
| 599 | 610 |
| 600 main_task_runner_->PostTask( | |
| 601 FROM_HERE, base::Bind(&RemoteRendererImpl::UpdateInterstitial, | |
| 602 weak_factory_.GetWeakPtr())); | |
| 603 | |
| 604 const State old_state = state_; | 611 const State old_state = state_; |
| 605 state_ = STATE_ERROR; | 612 state_ = STATE_ERROR; |
| 606 | 613 |
| 607 if (!init_workflow_done_callback_.is_null()) { | 614 if (!init_workflow_done_callback_.is_null()) { |
| 608 DCHECK(old_state == STATE_CREATE_PIPE || old_state == STATE_ACQUIRING || | 615 DCHECK(old_state == STATE_CREATE_PIPE || old_state == STATE_ACQUIRING || |
| 609 old_state == STATE_INITIALIZING); | 616 old_state == STATE_INITIALIZING); |
| 610 base::ResetAndReturn(&init_workflow_done_callback_).Run(error); | 617 base::ResetAndReturn(&init_workflow_done_callback_).Run(error); |
| 611 return; | 618 return; |
| 612 } | 619 } |
| 613 | 620 |
| 614 if (!flush_cb_.is_null()) | 621 if (!flush_cb_.is_null()) |
| 615 base::ResetAndReturn(&flush_cb_).Run(); | 622 base::ResetAndReturn(&flush_cb_).Run(); |
| 616 | 623 |
| 617 // After OnError() returns, the pipeline may destroy |this|. | 624 // After OnError() returns, the pipeline may destroy |this|. |
| 618 client_->OnError(error); | 625 client_->OnError(error); |
| 619 } | 626 } |
| 620 | 627 |
| 621 void RemoteRendererImpl::UpdateInterstitial() { | 628 // static |
| 622 DCHECK(main_task_runner_->BelongsToCurrentThread()); | 629 void RemoteRendererImpl::RequestUpdateInterstitialOnMainThread( |
| 630 scoped_refptr<base::SingleThreadTaskRunner> media_task_runner, |
| 631 base::WeakPtr<RemoteRendererImpl> remote_renderer_impl, |
| 632 const SkBitmap& background_image, |
| 633 const gfx::Size& canvas_size, |
| 634 RemotingInterstitialType interstitial_type) { |
| 635 media_task_runner->PostTask( |
| 636 FROM_HERE, |
| 637 base::Bind(&RemoteRendererImpl::UpdateInterstitial, remote_renderer_impl, |
| 638 background_image, canvas_size, interstitial_type)); |
| 639 } |
| 623 | 640 |
| 624 interstitial_ui_.ShowInterstitial( | 641 void RemoteRendererImpl::UpdateInterstitial( |
| 625 remoting_renderer_controller_->remoting_source()->state() == | 642 const SkBitmap& background_image, |
| 626 RemotingSessionState::SESSION_STARTED); | 643 const gfx::Size& canvas_size, |
| 644 RemotingInterstitialType interstitial_type) { |
| 645 DCHECK(media_task_runner_->BelongsToCurrentThread()); |
| 646 if (!background_image.drawsNothing()) |
| 647 interstitial_background_ = background_image; |
| 648 canvas_size_ = canvas_size; |
| 649 PaintRemotingInterstitial(interstitial_background_, canvas_size_, |
| 650 interstitial_type, video_renderer_sink_); |
| 627 } | 651 } |
| 628 | 652 |
| 629 } // namespace media | 653 } // namespace media |
| OLD | NEW |