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 |