| 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/video_frame_pump.h" | 5 #include "remoting/protocol/video_frame_pump.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 } | 100 } |
| 101 | 101 |
| 102 void VideoFramePump::SetLosslessColor(bool want_lossless) { | 102 void VideoFramePump::SetLosslessColor(bool want_lossless) { |
| 103 DCHECK(thread_checker_.CalledOnValidThread()); | 103 DCHECK(thread_checker_.CalledOnValidThread()); |
| 104 | 104 |
| 105 encode_task_runner_->PostTask( | 105 encode_task_runner_->PostTask( |
| 106 FROM_HERE, base::Bind(&VideoEncoder::SetLosslessColor, | 106 FROM_HERE, base::Bind(&VideoEncoder::SetLosslessColor, |
| 107 base::Unretained(encoder_.get()), want_lossless)); | 107 base::Unretained(encoder_.get()), want_lossless)); |
| 108 } | 108 } |
| 109 | 109 |
| 110 void VideoFramePump::SetSizeCallback(const SizeCallback& size_callback) { | 110 void VideoFramePump::SetObserver(Observer* observer) { |
| 111 DCHECK(thread_checker_.CalledOnValidThread()); | 111 DCHECK(thread_checker_.CalledOnValidThread()); |
| 112 size_callback_ = size_callback; | 112 observer_ = observer; |
| 113 } | 113 } |
| 114 | 114 |
| 115 void VideoFramePump::OnCaptureResult( | 115 void VideoFramePump::OnCaptureResult( |
| 116 webrtc::DesktopCapturer::Result result, | 116 webrtc::DesktopCapturer::Result result, |
| 117 std::unique_ptr<webrtc::DesktopFrame> frame) { | 117 std::unique_ptr<webrtc::DesktopFrame> frame) { |
| 118 DCHECK(thread_checker_.CalledOnValidThread()); | 118 DCHECK(thread_checker_.CalledOnValidThread()); |
| 119 | 119 |
| 120 capture_scheduler_.OnCaptureCompleted(); | 120 capture_scheduler_.OnCaptureCompleted(); |
| 121 | 121 |
| 122 captured_frame_timestamps_->capture_ended_time = base::TimeTicks::Now(); | 122 captured_frame_timestamps_->capture_ended_time = base::TimeTicks::Now(); |
| 123 | 123 |
| 124 if (frame) { | 124 if (frame) { |
| 125 webrtc::DesktopVector dpi = | 125 webrtc::DesktopVector dpi = |
| 126 frame->dpi().is_zero() ? webrtc::DesktopVector(kDefaultDpi, kDefaultDpi) | 126 frame->dpi().is_zero() ? webrtc::DesktopVector(kDefaultDpi, kDefaultDpi) |
| 127 : frame->dpi(); | 127 : frame->dpi(); |
| 128 if (!frame_size_.equals(frame->size()) || !frame_dpi_.equals(dpi)) { | 128 if (!frame_size_.equals(frame->size()) || !frame_dpi_.equals(dpi)) { |
| 129 frame_size_ = frame->size(); | 129 frame_size_ = frame->size(); |
| 130 frame_dpi_ = dpi; | 130 frame_dpi_ = dpi; |
| 131 if (!size_callback_.is_null()) | 131 if (observer_) |
| 132 size_callback_.Run(frame_size_, frame_dpi_); | 132 observer_->OnVideoSizeChanged(this, frame_size_, frame_dpi_); |
| 133 } | 133 } |
| 134 } | 134 } |
| 135 | 135 |
| 136 // Even when |frame| is nullptr we still need to post it to the encode thread | 136 // Even when |frame| is nullptr we still need to post it to the encode thread |
| 137 // to make sure frames are freed in the same order they are received and | 137 // to make sure frames are freed in the same order they are received and |
| 138 // that we don't start capturing frame n+2 before frame n is freed. | 138 // that we don't start capturing frame n+2 before frame n is freed. |
| 139 base::PostTaskAndReplyWithResult( | 139 base::PostTaskAndReplyWithResult( |
| 140 encode_task_runner_.get(), FROM_HERE, | 140 encode_task_runner_.get(), FROM_HERE, |
| 141 base::Bind(&VideoFramePump::EncodeFrame, encoder_.get(), | 141 base::Bind(&VideoFramePump::EncodeFrame, encoder_.get(), |
| 142 base::Passed(&frame), | 142 base::Passed(&frame), |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 201 } | 201 } |
| 202 } | 202 } |
| 203 | 203 |
| 204 void VideoFramePump::SendPacket(std::unique_ptr<PacketWithTimestamps> packet) { | 204 void VideoFramePump::SendPacket(std::unique_ptr<PacketWithTimestamps> packet) { |
| 205 DCHECK(thread_checker_.CalledOnValidThread()); | 205 DCHECK(thread_checker_.CalledOnValidThread()); |
| 206 DCHECK(!send_pending_); | 206 DCHECK(!send_pending_); |
| 207 | 207 |
| 208 packet->timestamps->can_send_time = base::TimeTicks::Now(); | 208 packet->timestamps->can_send_time = base::TimeTicks::Now(); |
| 209 UpdateFrameTimers(packet->packet.get(), packet->timestamps.get()); | 209 UpdateFrameTimers(packet->packet.get(), packet->timestamps.get()); |
| 210 | 210 |
| 211 if (observer_) { |
| 212 observer_->OnVideoFrameSent( |
| 213 this, packet->packet->frame_id(), |
| 214 packet->timestamps->input_event_client_timestamp); |
| 215 } |
| 216 |
| 211 send_pending_ = true; | 217 send_pending_ = true; |
| 212 video_stub_->ProcessVideoPacket(std::move(packet->packet), | 218 video_stub_->ProcessVideoPacket(std::move(packet->packet), |
| 213 base::Bind(&VideoFramePump::OnVideoPacketSent, | 219 base::Bind(&VideoFramePump::OnVideoPacketSent, |
| 214 weak_factory_.GetWeakPtr())); | 220 weak_factory_.GetWeakPtr())); |
| 215 } | 221 } |
| 216 | 222 |
| 217 void VideoFramePump::UpdateFrameTimers(VideoPacket* packet, | 223 void VideoFramePump::UpdateFrameTimers(VideoPacket* packet, |
| 218 FrameTimestamps* timestamps) { | 224 FrameTimestamps* timestamps) { |
| 219 if (g_enable_timestamps) | 225 if (g_enable_timestamps) |
| 220 packet->set_timestamp(timestamps->capture_ended_time.ToInternalValue()); | 226 packet->set_timestamp(timestamps->capture_ended_time.ToInternalValue()); |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 } | 273 } |
| 268 | 274 |
| 269 void VideoFramePump::OnKeepAlivePacketSent() { | 275 void VideoFramePump::OnKeepAlivePacketSent() { |
| 270 DCHECK(thread_checker_.CalledOnValidThread()); | 276 DCHECK(thread_checker_.CalledOnValidThread()); |
| 271 | 277 |
| 272 keep_alive_timer_.Reset(); | 278 keep_alive_timer_.Reset(); |
| 273 } | 279 } |
| 274 | 280 |
| 275 } // namespace protocol | 281 } // namespace protocol |
| 276 } // namespace remoting | 282 } // namespace remoting |
| OLD | NEW |