sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 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 |
| 3 | // found in the LICENSE file. |
| 4 | |
| 5 | #ifndef REMOTING_PROTOCOL_WEBRTC_VIDEO_STREAM_H_ |
| 6 | #define REMOTING_PROTOCOL_WEBRTC_VIDEO_STREAM_H_ |
| 7 | |
avi | 5a080f01 | 2015-12-22 23:15:43 | [diff] [blame] | 8 | #include <stdint.h> |
| 9 | |
dcheng | 0765c49 | 2016-04-06 22:41:53 | [diff] [blame] | 10 | #include <memory> |
| 11 | |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 12 | #include "base/callback.h" |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 13 | #include "base/macros.h" |
sergeyu | bf81cd6 | 2016-01-10 08:00:42 | [diff] [blame] | 14 | #include "base/memory/ref_counted.h" |
sergeyu | bf81cd6 | 2016-01-10 08:00:42 | [diff] [blame] | 15 | #include "base/memory/weak_ptr.h" |
gab | 10ae436 | 2016-11-02 23:34:53 | [diff] [blame] | 16 | #include "base/single_thread_task_runner.h" |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 17 | #include "base/threading/thread_checker.h" |
sergeyu | 2becb601 | 2016-09-13 18:41:32 | [diff] [blame] | 18 | #include "remoting/codec/webrtc_video_encoder.h" |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 19 | #include "remoting/protocol/host_video_stats_dispatcher.h" |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 20 | #include "remoting/protocol/video_stream.h" |
yuweih | 1481d8d | 2017-04-04 01:43:51 | [diff] [blame] | 21 | #include "third_party/webrtc/common_types.h" |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 22 | #include "third_party/webrtc/modules/desktop_capture/desktop_capturer.h" |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 23 | |
| 24 | namespace webrtc { |
| 25 | class MediaStreamInterface; |
| 26 | class PeerConnectionInterface; |
| 27 | } // namespace webrtc |
| 28 | |
| 29 | namespace remoting { |
| 30 | namespace protocol { |
| 31 | |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 32 | class HostVideoStatsDispatcher; |
sergeyu | 0eaa513 | 2016-09-20 01:39:34 | [diff] [blame] | 33 | class WebrtcFrameScheduler; |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 34 | class WebrtcTransport; |
sergeyu | bf81cd6 | 2016-01-10 08:00:42 | [diff] [blame] | 35 | |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 36 | class WebrtcVideoStream : public VideoStream, |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 37 | public webrtc::DesktopCapturer::Callback, |
| 38 | public HostVideoStatsDispatcher::EventHandler { |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 39 | public: |
sergeyu | bf81cd6 | 2016-01-10 08:00:42 | [diff] [blame] | 40 | WebrtcVideoStream(); |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 41 | ~WebrtcVideoStream() override; |
| 42 | |
sergeyu | 24b257a1 | 2016-10-09 02:46:28 | [diff] [blame] | 43 | void Start(std::unique_ptr<webrtc::DesktopCapturer> desktop_capturer, |
sergeyu | 2becb601 | 2016-09-13 18:41:32 | [diff] [blame] | 44 | WebrtcTransport* webrtc_transport, |
Sergey Ulanov | e50708f | 2017-06-20 21:29:11 | [diff] [blame] | 45 | scoped_refptr<base::SequencedTaskRunner> encode_task_runner); |
sergeyu | bf81cd6 | 2016-01-10 08:00:42 | [diff] [blame] | 46 | |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 47 | // VideoStream interface. |
sergeyu | e84cc62 | 2016-10-15 06:54:03 | [diff] [blame] | 48 | void SetEventTimestampsSource(scoped_refptr<InputEventTimestampsSource> |
| 49 | event_timestamps_source) override; |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 50 | void Pause(bool pause) override; |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 51 | void SetLosslessEncode(bool want_lossless) override; |
| 52 | void SetLosslessColor(bool want_lossless) override; |
sergeyu | ad51be8 | 2016-06-22 06:04:39 | [diff] [blame] | 53 | void SetObserver(Observer* observer) override; |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 54 | |
| 55 | private: |
zijiehe | 805f2ca | 2017-03-27 00:56:00 | [diff] [blame] | 56 | struct FrameStats; |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 57 | |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 58 | // webrtc::DesktopCapturer::Callback interface. |
| 59 | void OnCaptureResult(webrtc::DesktopCapturer::Result result, |
| 60 | std::unique_ptr<webrtc::DesktopFrame> frame) override; |
| 61 | |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 62 | // HostVideoStatsDispatcher::EventHandler interface. |
| 63 | void OnChannelInitialized(ChannelDispatcherBase* channel_dispatcher) override; |
| 64 | void OnChannelClosed(ChannelDispatcherBase* channel_dispatcher) override; |
| 65 | |
sergeyu | 0eaa513 | 2016-09-20 01:39:34 | [diff] [blame] | 66 | // Called by the |scheduler_|. |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 67 | void CaptureNextFrame(); |
| 68 | |
Sergey Ulanov | e50708f | 2017-06-20 21:29:11 | [diff] [blame] | 69 | void OnFrameEncoded(std::unique_ptr<WebrtcVideoEncoder::EncodedFrame> frame); |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 70 | |
yuweih | 1481d8d | 2017-04-04 01:43:51 | [diff] [blame] | 71 | void OnEncoderCreated(webrtc::VideoCodecType codec_type); |
| 72 | |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 73 | // 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 Ulanov | e50708f | 2017-06-20 21:29:11 | [diff] [blame] | 78 | scoped_refptr<base::SequencedTaskRunner> encode_task_runner_; |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 79 | // Used to encode captured frames. Always accessed on the encode thread. |
sergeyu | 2becb601 | 2016-09-13 18:41:32 | [diff] [blame] | 80 | std::unique_ptr<WebrtcVideoEncoder> encoder_; |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 81 | |
sergeyu | e84cc62 | 2016-10-15 06:54:03 | [diff] [blame] | 82 | scoped_refptr<InputEventTimestampsSource> event_timestamps_source_; |
| 83 | |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 84 | scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_; |
sergeyu | bf81cd6 | 2016-01-10 08:00:42 | [diff] [blame] | 85 | scoped_refptr<webrtc::MediaStreamInterface> stream_; |
| 86 | |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 87 | HostVideoStatsDispatcher video_stats_dispatcher_; |
| 88 | |
zijiehe | 805f2ca | 2017-03-27 00:56:00 | [diff] [blame] | 89 | // Stats of the frame that's being captured. |
Sergey Ulanov | e50708f | 2017-06-20 21:29:11 | [diff] [blame] | 90 | std::unique_ptr<FrameStats> current_frame_stats_; |
sergeyu | 0936463 | 2016-08-11 00:08:10 | [diff] [blame] | 91 | |
sergeyu | 0eaa513 | 2016-09-20 01:39:34 | [diff] [blame] | 92 | std::unique_ptr<WebrtcFrameScheduler> scheduler_; |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 93 | |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 94 | webrtc::DesktopSize frame_size_; |
| 95 | webrtc::DesktopVector frame_dpi_; |
sergeyu | ad51be8 | 2016-06-22 06:04:39 | [diff] [blame] | 96 | Observer* observer_ = nullptr; |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 97 | |
sergeyu | 4e10ab1 | 2016-06-22 00:56:22 | [diff] [blame] | 98 | base::ThreadChecker thread_checker_; |
| 99 | |
| 100 | base::WeakPtrFactory<WebrtcVideoStream> weak_factory_; |
sergeyu | 0fc40f9 | 2015-12-10 18:42:43 | [diff] [blame] | 101 | |
| 102 | DISALLOW_COPY_AND_ASSIGN(WebrtcVideoStream); |
| 103 | }; |
| 104 | |
| 105 | } // namespace protocol |
| 106 | } // namespace remoting |
| 107 | |
| 108 | #endif // REMOTING_PROTOCOL_WEBRTC_VIDEO_STREAM_H_ |