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/webrtc_video_stream.h" | 5 #include "remoting/protocol/webrtc_video_stream.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/single_thread_task_runner.h" | 8 #include "base/single_thread_task_runner.h" |
9 #include "base/task_runner_util.h" | 9 #include "base/task_runner_util.h" |
10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 WebrtcVideoStream::~WebrtcVideoStream() { | 70 WebrtcVideoStream::~WebrtcVideoStream() { |
71 if (stream_) { | 71 if (stream_) { |
72 for (const auto& track : stream_->GetVideoTracks()) { | 72 for (const auto& track : stream_->GetVideoTracks()) { |
73 stream_->RemoveTrack(track.get()); | 73 stream_->RemoveTrack(track.get()); |
74 } | 74 } |
75 peer_connection_->RemoveStream(stream_.get()); | 75 peer_connection_->RemoveStream(stream_.get()); |
76 } | 76 } |
77 encode_task_runner_->DeleteSoon(FROM_HERE, encoder_.release()); | 77 encode_task_runner_->DeleteSoon(FROM_HERE, encoder_.release()); |
78 } | 78 } |
79 | 79 |
80 bool WebrtcVideoStream::Start( | 80 void WebrtcVideoStream::Start( |
81 std::unique_ptr<webrtc::DesktopCapturer> desktop_capturer, | 81 std::unique_ptr<webrtc::DesktopCapturer> desktop_capturer, |
82 WebrtcTransport* webrtc_transport, | 82 WebrtcTransport* webrtc_transport, |
83 scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) { | 83 scoped_refptr<base::SingleThreadTaskRunner> encode_task_runner) { |
84 DCHECK(thread_checker_.CalledOnValidThread()); | 84 DCHECK(thread_checker_.CalledOnValidThread()); |
85 DCHECK(webrtc_transport); | 85 DCHECK(webrtc_transport); |
86 DCHECK(desktop_capturer); | 86 DCHECK(desktop_capturer); |
87 DCHECK(encode_task_runner); | 87 DCHECK(encode_task_runner); |
88 | 88 |
89 scoped_refptr<webrtc::PeerConnectionFactoryInterface> peer_connection_factory( | 89 scoped_refptr<webrtc::PeerConnectionFactoryInterface> peer_connection_factory( |
90 webrtc_transport->peer_connection_factory()); | 90 webrtc_transport->peer_connection_factory()); |
(...skipping 14 matching lines...) Expand all Loading... |
105 webrtc::MediaConstraintsInterface::kMinFrameRate, 5); | 105 webrtc::MediaConstraintsInterface::kMinFrameRate, 5); |
106 | 106 |
107 rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> src = | 107 rtc::scoped_refptr<webrtc::VideoTrackSourceInterface> src = |
108 peer_connection_factory->CreateVideoSource(new WebrtcDummyVideoCapturer(), | 108 peer_connection_factory->CreateVideoSource(new WebrtcDummyVideoCapturer(), |
109 &video_constraints); | 109 &video_constraints); |
110 rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track = | 110 rtc::scoped_refptr<webrtc::VideoTrackInterface> video_track = |
111 peer_connection_factory->CreateVideoTrack(kVideoLabel, src); | 111 peer_connection_factory->CreateVideoTrack(kVideoLabel, src); |
112 | 112 |
113 stream_ = peer_connection_factory->CreateLocalMediaStream(kStreamLabel); | 113 stream_ = peer_connection_factory->CreateLocalMediaStream(kStreamLabel); |
114 | 114 |
115 if (!stream_->AddTrack(video_track.get()) || | 115 // AddTrack() may fail only if there is another track with the same name, |
116 !peer_connection_->AddStream(stream_.get())) { | 116 // which is impossible because it's a brand new stream. |
117 stream_ = nullptr; | 117 bool result = stream_->AddTrack(video_track.get()); |
118 peer_connection_ = nullptr; | 118 DCHECK(result); |
119 return false; | 119 |
120 } | 120 // AddStream() may fail if there is another stream with the same name or when |
| 121 // the PeerConnection is closed, neither is expected. |
| 122 result = peer_connection_->AddStream(stream_.get()); |
| 123 DCHECK(result); |
121 | 124 |
122 // Register for PLI requests. | 125 // Register for PLI requests. |
123 webrtc_transport_->video_encoder_factory()->SetKeyFrameRequestCallback( | 126 webrtc_transport_->video_encoder_factory()->SetKeyFrameRequestCallback( |
124 base::Bind(&PostTaskOnTaskRunner, base::ThreadTaskRunnerHandle::Get(), | 127 base::Bind(&PostTaskOnTaskRunner, base::ThreadTaskRunnerHandle::Get(), |
125 base::Bind(&WebrtcVideoStream::SetKeyFrameRequest, | 128 base::Bind(&WebrtcVideoStream::SetKeyFrameRequest, |
126 weak_factory_.GetWeakPtr()))); | 129 weak_factory_.GetWeakPtr()))); |
127 | 130 |
128 // Register for target bitrate notifications. | 131 // Register for target bitrate notifications. |
129 webrtc_transport_->video_encoder_factory()->SetTargetBitrateCallback( | 132 webrtc_transport_->video_encoder_factory()->SetTargetBitrateCallback( |
130 base::Bind(&PostTaskOnTaskRunnerWithParam<int>, | 133 base::Bind(&PostTaskOnTaskRunnerWithParam<int>, |
131 base::ThreadTaskRunnerHandle::Get(), | 134 base::ThreadTaskRunnerHandle::Get(), |
132 base::Bind(&WebrtcVideoStream::SetTargetBitrate, | 135 base::Bind(&WebrtcVideoStream::SetTargetBitrate, |
133 weak_factory_.GetWeakPtr()))); | 136 weak_factory_.GetWeakPtr()))); |
134 | 137 |
135 video_stats_dispatcher_.Init(webrtc_transport_->CreateOutgoingChannel( | 138 video_stats_dispatcher_.Init(webrtc_transport_->CreateOutgoingChannel( |
136 video_stats_dispatcher_.channel_name()), | 139 video_stats_dispatcher_.channel_name()), |
137 this); | 140 this); |
138 | 141 |
139 scheduler_.reset(new WebrtcFrameSchedulerSimple()); | 142 scheduler_.reset(new WebrtcFrameSchedulerSimple()); |
140 | |
141 return true; | |
142 } | 143 } |
143 | 144 |
144 void WebrtcVideoStream::Pause(bool pause) { | 145 void WebrtcVideoStream::Pause(bool pause) { |
145 DCHECK(thread_checker_.CalledOnValidThread()); | 146 DCHECK(thread_checker_.CalledOnValidThread()); |
146 scheduler_->Pause(pause); | 147 scheduler_->Pause(pause); |
147 } | 148 } |
148 | 149 |
149 void WebrtcVideoStream::OnInputEventReceived(int64_t event_timestamp) { | 150 void WebrtcVideoStream::OnInputEventReceived(int64_t event_timestamp) { |
150 DCHECK(thread_checker_.CalledOnValidThread()); | 151 DCHECK(thread_checker_.CalledOnValidThread()); |
151 | 152 |
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 // TODO(sergeyu): Figure out how to measure send_pending time with WebRTC | 306 // TODO(sergeyu): Figure out how to measure send_pending time with WebRTC |
306 // and set it here. | 307 // and set it here. |
307 stats.send_pending_delay = base::TimeDelta(); | 308 stats.send_pending_delay = base::TimeDelta(); |
308 | 309 |
309 video_stats_dispatcher_.OnVideoFrameStats(result.frame_id, stats); | 310 video_stats_dispatcher_.OnVideoFrameStats(result.frame_id, stats); |
310 } | 311 } |
311 } | 312 } |
312 | 313 |
313 } // namespace protocol | 314 } // namespace protocol |
314 } // namespace remoting | 315 } // namespace remoting |
OLD | NEW |