OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 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 "remoting/protocol/ice_connection_to_client.h" | 5 #include "remoting/protocol/ice_connection_to_client.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
| 10 #include "remoting/codec/video_encoder.h" |
| 11 #include "remoting/codec/video_encoder_verbatim.h" |
| 12 #include "remoting/codec/video_encoder_vpx.h" |
10 #include "remoting/protocol/audio_writer.h" | 13 #include "remoting/protocol/audio_writer.h" |
11 #include "remoting/protocol/clipboard_stub.h" | 14 #include "remoting/protocol/clipboard_stub.h" |
12 #include "remoting/protocol/host_control_dispatcher.h" | 15 #include "remoting/protocol/host_control_dispatcher.h" |
13 #include "remoting/protocol/host_event_dispatcher.h" | 16 #include "remoting/protocol/host_event_dispatcher.h" |
14 #include "remoting/protocol/host_stub.h" | 17 #include "remoting/protocol/host_stub.h" |
15 #include "remoting/protocol/host_video_dispatcher.h" | 18 #include "remoting/protocol/host_video_dispatcher.h" |
16 #include "remoting/protocol/input_stub.h" | 19 #include "remoting/protocol/input_stub.h" |
| 20 #include "remoting/protocol/video_frame_pump.h" |
17 | 21 |
18 namespace remoting { | 22 namespace remoting { |
19 namespace protocol { | 23 namespace protocol { |
20 | 24 |
| 25 namespace { |
| 26 |
| 27 scoped_ptr<VideoEncoder> CreateVideoEncoder( |
| 28 const protocol::SessionConfig& config) { |
| 29 const protocol::ChannelConfig& video_config = config.video_config(); |
| 30 |
| 31 if (video_config.codec == protocol::ChannelConfig::CODEC_VP8) { |
| 32 return VideoEncoderVpx::CreateForVP8().Pass(); |
| 33 } else if (video_config.codec == protocol::ChannelConfig::CODEC_VP9) { |
| 34 return VideoEncoderVpx::CreateForVP9().Pass(); |
| 35 } else if (video_config.codec == protocol::ChannelConfig::CODEC_VERBATIM) { |
| 36 return make_scoped_ptr(new VideoEncoderVerbatim()); |
| 37 } |
| 38 |
| 39 NOTREACHED(); |
| 40 return nullptr; |
| 41 } |
| 42 |
| 43 } // namespace |
| 44 |
21 IceConnectionToClient::IceConnectionToClient( | 45 IceConnectionToClient::IceConnectionToClient( |
22 scoped_ptr<protocol::Session> session) | 46 scoped_ptr<protocol::Session> session, |
23 : handler_(nullptr), session_(session.Pass()) { | 47 scoped_refptr<base::SingleThreadTaskRunner> video_encode_task_runner) |
| 48 : event_handler_(nullptr), |
| 49 session_(session.Pass()), |
| 50 video_encode_task_runner_(video_encode_task_runner) { |
24 session_->SetEventHandler(this); | 51 session_->SetEventHandler(this); |
25 } | 52 } |
26 | 53 |
27 IceConnectionToClient::~IceConnectionToClient() { | 54 IceConnectionToClient::~IceConnectionToClient() {} |
28 } | |
29 | 55 |
30 void IceConnectionToClient::SetEventHandler( | 56 void IceConnectionToClient::SetEventHandler( |
31 ConnectionToClient::EventHandler* event_handler) { | 57 ConnectionToClient::EventHandler* event_handler) { |
32 DCHECK(thread_checker_.CalledOnValidThread()); | 58 DCHECK(thread_checker_.CalledOnValidThread()); |
33 handler_ = event_handler; | 59 event_handler_ = event_handler; |
34 } | 60 } |
35 | 61 |
36 protocol::Session* IceConnectionToClient::session() { | 62 protocol::Session* IceConnectionToClient::session() { |
37 DCHECK(thread_checker_.CalledOnValidThread()); | 63 DCHECK(thread_checker_.CalledOnValidThread()); |
38 return session_.get(); | 64 return session_.get(); |
39 } | 65 } |
40 | 66 |
41 void IceConnectionToClient::Disconnect(ErrorCode error) { | 67 void IceConnectionToClient::Disconnect(ErrorCode error) { |
42 DCHECK(thread_checker_.CalledOnValidThread()); | 68 DCHECK(thread_checker_.CalledOnValidThread()); |
43 | 69 |
44 CloseChannels(); | 70 CloseChannels(); |
45 | 71 |
46 // This should trigger OnConnectionClosed() event and this object | 72 // This should trigger OnConnectionClosed() event and this object |
47 // may be destroyed as the result. | 73 // may be destroyed as the result. |
48 session_->Close(error); | 74 session_->Close(error); |
49 } | 75 } |
50 | 76 |
51 void IceConnectionToClient::OnInputEventReceived(int64_t timestamp) { | 77 void IceConnectionToClient::OnInputEventReceived(int64_t timestamp) { |
52 DCHECK(thread_checker_.CalledOnValidThread()); | 78 DCHECK(thread_checker_.CalledOnValidThread()); |
53 handler_->OnInputEventReceived(this, timestamp); | 79 event_handler_->OnInputEventReceived(this, timestamp); |
54 } | 80 } |
55 | 81 |
56 VideoStub* IceConnectionToClient::video_stub() { | 82 scoped_ptr<VideoStream> IceConnectionToClient::StartVideoStream( |
| 83 scoped_ptr<webrtc::DesktopCapturer> desktop_capturer) { |
57 DCHECK(thread_checker_.CalledOnValidThread()); | 84 DCHECK(thread_checker_.CalledOnValidThread()); |
58 return video_dispatcher_.get(); | 85 |
| 86 scoped_ptr<VideoEncoder> video_encoder = |
| 87 CreateVideoEncoder(session_->config()); |
| 88 event_handler_->OnCreateVideoEncoder(&video_encoder); |
| 89 DCHECK(video_encoder); |
| 90 |
| 91 scoped_ptr<VideoFramePump> pump( |
| 92 new VideoFramePump(video_encode_task_runner_, desktop_capturer.Pass(), |
| 93 video_encoder.Pass(), video_dispatcher_.get())); |
| 94 video_dispatcher_->set_video_feedback_stub(pump->video_feedback_stub()); |
| 95 return pump.Pass(); |
59 } | 96 } |
60 | 97 |
61 AudioStub* IceConnectionToClient::audio_stub() { | 98 AudioStub* IceConnectionToClient::audio_stub() { |
62 DCHECK(thread_checker_.CalledOnValidThread()); | 99 DCHECK(thread_checker_.CalledOnValidThread()); |
63 return audio_writer_.get(); | 100 return audio_writer_.get(); |
64 } | 101 } |
65 | 102 |
66 // Return pointer to ClientStub. | 103 // Return pointer to ClientStub. |
67 ClientStub* IceConnectionToClient::client_stub() { | 104 ClientStub* IceConnectionToClient::client_stub() { |
68 DCHECK(thread_checker_.CalledOnValidThread()); | 105 DCHECK(thread_checker_.CalledOnValidThread()); |
69 return control_dispatcher_.get(); | 106 return control_dispatcher_.get(); |
70 } | 107 } |
71 | 108 |
72 void IceConnectionToClient::set_clipboard_stub( | 109 void IceConnectionToClient::set_clipboard_stub( |
73 protocol::ClipboardStub* clipboard_stub) { | 110 protocol::ClipboardStub* clipboard_stub) { |
74 DCHECK(thread_checker_.CalledOnValidThread()); | 111 DCHECK(thread_checker_.CalledOnValidThread()); |
75 control_dispatcher_->set_clipboard_stub(clipboard_stub); | 112 control_dispatcher_->set_clipboard_stub(clipboard_stub); |
76 } | 113 } |
77 | 114 |
78 void IceConnectionToClient::set_host_stub(protocol::HostStub* host_stub) { | 115 void IceConnectionToClient::set_host_stub(protocol::HostStub* host_stub) { |
79 DCHECK(thread_checker_.CalledOnValidThread()); | 116 DCHECK(thread_checker_.CalledOnValidThread()); |
80 control_dispatcher_->set_host_stub(host_stub); | 117 control_dispatcher_->set_host_stub(host_stub); |
81 } | 118 } |
82 | 119 |
83 void IceConnectionToClient::set_input_stub(protocol::InputStub* input_stub) { | 120 void IceConnectionToClient::set_input_stub(protocol::InputStub* input_stub) { |
84 DCHECK(thread_checker_.CalledOnValidThread()); | 121 DCHECK(thread_checker_.CalledOnValidThread()); |
85 event_dispatcher_->set_input_stub(input_stub); | 122 event_dispatcher_->set_input_stub(input_stub); |
86 } | 123 } |
87 | 124 |
88 void IceConnectionToClient::set_video_feedback_stub( | |
89 VideoFeedbackStub* video_feedback_stub) { | |
90 DCHECK(thread_checker_.CalledOnValidThread()); | |
91 video_dispatcher_->set_video_feedback_stub(video_feedback_stub); | |
92 } | |
93 | |
94 void IceConnectionToClient::OnSessionStateChange(Session::State state) { | 125 void IceConnectionToClient::OnSessionStateChange(Session::State state) { |
95 DCHECK(thread_checker_.CalledOnValidThread()); | 126 DCHECK(thread_checker_.CalledOnValidThread()); |
96 | 127 |
97 DCHECK(handler_); | 128 DCHECK(event_handler_); |
98 switch (state) { | 129 switch (state) { |
99 case Session::INITIALIZING: | 130 case Session::INITIALIZING: |
100 case Session::CONNECTING: | 131 case Session::CONNECTING: |
101 case Session::ACCEPTING: | 132 case Session::ACCEPTING: |
102 case Session::ACCEPTED: | 133 case Session::ACCEPTED: |
103 case Session::CONNECTED: | 134 case Session::CONNECTED: |
104 // Don't care about these events. | 135 // Don't care about these events. |
105 break; | 136 break; |
106 case Session::AUTHENTICATING: | 137 case Session::AUTHENTICATING: |
107 handler_->OnConnectionAuthenticating(this); | 138 event_handler_->OnConnectionAuthenticating(this); |
108 break; | 139 break; |
109 case Session::AUTHENTICATED: | 140 case Session::AUTHENTICATED: |
110 // Initialize channels. | 141 // Initialize channels. |
111 control_dispatcher_.reset(new HostControlDispatcher()); | 142 control_dispatcher_.reset(new HostControlDispatcher()); |
112 control_dispatcher_->Init(session_.get(), | 143 control_dispatcher_->Init(session_.get(), |
113 session_->config().control_config(), this); | 144 session_->config().control_config(), this); |
114 | 145 |
115 event_dispatcher_.reset(new HostEventDispatcher()); | 146 event_dispatcher_.reset(new HostEventDispatcher()); |
116 event_dispatcher_->Init(session_.get(), session_->config().event_config(), | 147 event_dispatcher_->Init(session_.get(), session_->config().event_config(), |
117 this); | 148 this); |
118 event_dispatcher_->set_on_input_event_callback( | 149 event_dispatcher_->set_on_input_event_callback( |
119 base::Bind(&IceConnectionToClient::OnInputEventReceived, | 150 base::Bind(&IceConnectionToClient::OnInputEventReceived, |
120 base::Unretained(this))); | 151 base::Unretained(this))); |
121 | 152 |
122 video_dispatcher_.reset(new HostVideoDispatcher()); | 153 video_dispatcher_.reset(new HostVideoDispatcher()); |
123 video_dispatcher_->Init(session_.get(), session_->config().video_config(), | 154 video_dispatcher_->Init(session_.get(), session_->config().video_config(), |
124 this); | 155 this); |
125 | 156 |
126 audio_writer_ = AudioWriter::Create(session_->config()); | 157 audio_writer_ = AudioWriter::Create(session_->config()); |
127 if (audio_writer_.get()) { | 158 if (audio_writer_.get()) { |
128 audio_writer_->Init(session_.get(), session_->config().audio_config(), | 159 audio_writer_->Init(session_.get(), session_->config().audio_config(), |
129 this); | 160 this); |
130 } | 161 } |
131 | 162 |
132 // Notify the handler after initializing the channels, so that | 163 // Notify the handler after initializing the channels, so that |
133 // ClientSession can get a client clipboard stub. | 164 // ClientSession can get a client clipboard stub. |
134 handler_->OnConnectionAuthenticated(this); | 165 event_handler_->OnConnectionAuthenticated(this); |
135 break; | 166 break; |
136 | 167 |
137 case Session::CLOSED: | 168 case Session::CLOSED: |
138 Close(OK); | 169 Close(OK); |
139 break; | 170 break; |
140 | 171 |
141 case Session::FAILED: | 172 case Session::FAILED: |
142 Close(session_->error()); | 173 Close(session_->error()); |
143 break; | 174 break; |
144 } | 175 } |
145 } | 176 } |
146 | 177 |
147 void IceConnectionToClient::OnSessionRouteChange( | 178 void IceConnectionToClient::OnSessionRouteChange( |
148 const std::string& channel_name, | 179 const std::string& channel_name, |
149 const TransportRoute& route) { | 180 const TransportRoute& route) { |
150 handler_->OnRouteChange(this, channel_name, route); | 181 event_handler_->OnRouteChange(this, channel_name, route); |
151 } | 182 } |
152 | 183 |
153 void IceConnectionToClient::OnChannelInitialized( | 184 void IceConnectionToClient::OnChannelInitialized( |
154 ChannelDispatcherBase* channel_dispatcher) { | 185 ChannelDispatcherBase* channel_dispatcher) { |
155 DCHECK(thread_checker_.CalledOnValidThread()); | 186 DCHECK(thread_checker_.CalledOnValidThread()); |
156 | 187 |
157 NotifyIfChannelsReady(); | 188 NotifyIfChannelsReady(); |
158 } | 189 } |
159 | 190 |
160 void IceConnectionToClient::OnChannelError( | 191 void IceConnectionToClient::OnChannelError( |
(...skipping 12 matching lines...) Expand all Loading... |
173 if (!control_dispatcher_ || !control_dispatcher_->is_connected()) | 204 if (!control_dispatcher_ || !control_dispatcher_->is_connected()) |
174 return; | 205 return; |
175 if (!event_dispatcher_ || !event_dispatcher_->is_connected()) | 206 if (!event_dispatcher_ || !event_dispatcher_->is_connected()) |
176 return; | 207 return; |
177 if (!video_dispatcher_ || !video_dispatcher_->is_connected()) | 208 if (!video_dispatcher_ || !video_dispatcher_->is_connected()) |
178 return; | 209 return; |
179 if ((!audio_writer_ || !audio_writer_->is_connected()) && | 210 if ((!audio_writer_ || !audio_writer_->is_connected()) && |
180 session_->config().is_audio_enabled()) { | 211 session_->config().is_audio_enabled()) { |
181 return; | 212 return; |
182 } | 213 } |
183 handler_->OnConnectionChannelsConnected(this); | 214 event_handler_->OnConnectionChannelsConnected(this); |
184 } | 215 } |
185 | 216 |
186 void IceConnectionToClient::Close(ErrorCode error) { | 217 void IceConnectionToClient::Close(ErrorCode error) { |
187 CloseChannels(); | 218 CloseChannels(); |
188 handler_->OnConnectionClosed(this, error); | 219 event_handler_->OnConnectionClosed(this, error); |
189 } | 220 } |
190 | 221 |
191 void IceConnectionToClient::CloseChannels() { | 222 void IceConnectionToClient::CloseChannels() { |
192 control_dispatcher_.reset(); | 223 control_dispatcher_.reset(); |
193 event_dispatcher_.reset(); | 224 event_dispatcher_.reset(); |
194 video_dispatcher_.reset(); | 225 video_dispatcher_.reset(); |
195 audio_writer_.reset(); | 226 audio_writer_.reset(); |
196 } | 227 } |
197 | 228 |
198 } // namespace protocol | 229 } // namespace protocol |
199 } // namespace remoting | 230 } // namespace remoting |
OLD | NEW |