blob: 64578b48de23faea7e9442dc3ff9f381a9805e3a [file] [log] [blame]
sergeyu0fc40f92015-12-10 18:42:431// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef REMOTING_PROTOCOL_WEBRTC_VIDEO_STREAM_H_
6#define REMOTING_PROTOCOL_WEBRTC_VIDEO_STREAM_H_
7
avi5a080f012015-12-22 23:15:438#include <stdint.h>
9
dcheng0765c492016-04-06 22:41:5310#include <memory>
11
sergeyu4e10ab12016-06-22 00:56:2212#include "base/callback.h"
sergeyu0fc40f92015-12-10 18:42:4313#include "base/macros.h"
sergeyubf81cd62016-01-10 08:00:4214#include "base/memory/ref_counted.h"
sergeyubf81cd62016-01-10 08:00:4215#include "base/memory/weak_ptr.h"
gab10ae4362016-11-02 23:34:5316#include "base/single_thread_task_runner.h"
sergeyu4e10ab12016-06-22 00:56:2217#include "base/threading/thread_checker.h"
sergeyu2becb6012016-09-13 18:41:3218#include "remoting/codec/webrtc_video_encoder.h"
sergeyu09364632016-08-11 00:08:1019#include "remoting/protocol/host_video_stats_dispatcher.h"
sergeyu0fc40f92015-12-10 18:42:4320#include "remoting/protocol/video_stream.h"
yuweih1481d8d2017-04-04 01:43:5121#include "third_party/webrtc/common_types.h"
sergeyu4e10ab12016-06-22 00:56:2222#include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h"
sergeyu0fc40f92015-12-10 18:42:4323
24namespace webrtc {
25class MediaStreamInterface;
26class PeerConnectionInterface;
27} // namespace webrtc
28
29namespace remoting {
30namespace protocol {
31
sergeyu09364632016-08-11 00:08:1032class HostVideoStatsDispatcher;
sergeyu0eaa5132016-09-20 01:39:3433class WebrtcFrameScheduler;
sergeyu4e10ab12016-06-22 00:56:2234class WebrtcTransport;
sergeyubf81cd62016-01-10 08:00:4235
sergeyu4e10ab12016-06-22 00:56:2236class WebrtcVideoStream : public VideoStream,
sergeyu09364632016-08-11 00:08:1037 public webrtc::DesktopCapturer::Callback,
38 public HostVideoStatsDispatcher::EventHandler {
sergeyu0fc40f92015-12-10 18:42:4339 public:
sergeyubf81cd62016-01-10 08:00:4240 WebrtcVideoStream();
sergeyu0fc40f92015-12-10 18:42:4341 ~WebrtcVideoStream() override;
42
sergeyu24b257a12016-10-09 02:46:2843 void Start(std::unique_ptr<webrtc::DesktopCapturer> desktop_capturer,
sergeyu2becb6012016-09-13 18:41:3244 WebrtcTransport* webrtc_transport,
Sergey Ulanove50708f2017-06-20 21:29:1145 scoped_refptr<base::SequencedTaskRunner> encode_task_runner);
sergeyubf81cd62016-01-10 08:00:4246
sergeyu0fc40f92015-12-10 18:42:4347 // VideoStream interface.
sergeyue84cc622016-10-15 06:54:0348 void SetEventTimestampsSource(scoped_refptr<InputEventTimestampsSource>
49 event_timestamps_source) override;
sergeyu0fc40f92015-12-10 18:42:4350 void Pause(bool pause) override;
sergeyu0fc40f92015-12-10 18:42:4351 void SetLosslessEncode(bool want_lossless) override;
52 void SetLosslessColor(bool want_lossless) override;
sergeyuad51be82016-06-22 06:04:3953 void SetObserver(Observer* observer) override;
sergeyu0fc40f92015-12-10 18:42:4354
55 private:
zijiehe805f2ca2017-03-27 00:56:0056 struct FrameStats;
sergeyu09364632016-08-11 00:08:1057
sergeyu4e10ab12016-06-22 00:56:2258 // webrtc::DesktopCapturer::Callback interface.
59 void OnCaptureResult(webrtc::DesktopCapturer::Result result,
60 std::unique_ptr<webrtc::DesktopFrame> frame) override;
61
sergeyu09364632016-08-11 00:08:1062 // HostVideoStatsDispatcher::EventHandler interface.
63 void OnChannelInitialized(ChannelDispatcherBase* channel_dispatcher) override;
64 void OnChannelClosed(ChannelDispatcherBase* channel_dispatcher) override;
65
sergeyu0eaa5132016-09-20 01:39:3466 // Called by the |scheduler_|.
sergeyu4e10ab12016-06-22 00:56:2267 void CaptureNextFrame();
68
Sergey Ulanove50708f2017-06-20 21:29:1169 void OnFrameEncoded(std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame);
sergeyu4e10ab12016-06-22 00:56:2270
yuweih1481d8d2017-04-04 01:43:5171 void OnEncoderCreated(webrtc::VideoCodecType codec_type);
72
sergeyu09364632016-08-11 00:08:1073 // Capturer used to capture the screen.
74 std::unique_ptr<webrtc::DesktopCapturer> capturer_;
75 // Used to send across encoded frames.
76 WebrtcTransport* webrtc_transport_ = nullptr;
77 // Task runner used to run |encoder_|.
Sergey Ulanove50708f2017-06-20 21:29:1178 scoped_refptr<base::SequencedTaskRunner> encode_task_runner_;
sergeyu09364632016-08-11 00:08:1079 // Used to encode captured frames. Always accessed on the encode thread.
sergeyu2becb6012016-09-13 18:41:3280 std::unique_ptr<WebrtcVideoEncoder> encoder_;
sergeyu09364632016-08-11 00:08:1081
sergeyue84cc622016-10-15 06:54:0382 scoped_refptr<InputEventTimestampsSource> event_timestamps_source_;
83
sergeyu4e10ab12016-06-22 00:56:2284 scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
sergeyubf81cd62016-01-10 08:00:4285 scoped_refptr<webrtc::MediaStreamInterface> stream_;
86
sergeyu09364632016-08-11 00:08:1087 HostVideoStatsDispatcher video_stats_dispatcher_;
88
zijiehe805f2ca2017-03-27 00:56:0089 // Stats of the frame that's being captured.
Sergey Ulanove50708f2017-06-20 21:29:1190 std::unique_ptr<FrameStats> current_frame_stats_;
sergeyu09364632016-08-11 00:08:1091
sergeyu0eaa5132016-09-20 01:39:3492 std::unique_ptr<WebrtcFrameScheduler> scheduler_;
sergeyu4e10ab12016-06-22 00:56:2293
sergeyu4e10ab12016-06-22 00:56:2294 webrtc::DesktopSize frame_size_;
95 webrtc::DesktopVector frame_dpi_;
sergeyuad51be82016-06-22 06:04:3996 Observer* observer_ = nullptr;
sergeyu4e10ab12016-06-22 00:56:2297
sergeyu4e10ab12016-06-22 00:56:2298 base::ThreadChecker thread_checker_;
99
100 base::WeakPtrFactory<WebrtcVideoStream> weak_factory_;
sergeyu0fc40f92015-12-10 18:42:43101
102 DISALLOW_COPY_AND_ASSIGN(WebrtcVideoStream);
103};
104
105} // namespace protocol
106} // namespace remoting
107
108#endif // REMOTING_PROTOCOL_WEBRTC_VIDEO_STREAM_H_