1 // Copyright 2016 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_DUMMY_VIDEO_ENCODER_H_
6 #define REMOTING_PROTOCOL_WEBRTC_DUMMY_VIDEO_ENCODER_H_
7 
8 #include <memory>
9 #include <vector>
10 
11 #include "base/callback.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/memory/weak_ptr.h"
14 #include "base/single_thread_task_runner.h"
15 #include "base/synchronization/lock.h"
16 #include "remoting/codec/webrtc_video_encoder.h"
17 #include "third_party/webrtc/api/video_codecs/video_encoder_factory.h"
18 #include "third_party/webrtc/modules/video_coding/include/video_codec_interface.h"
19 
20 namespace remoting {
21 namespace protocol {
22 
23 class VideoChannelStateObserver;
24 class WebrtcDummyVideoEncoderFactory;
25 
26 // WebrtcDummyVideoEncoder implements webrtc::VideoEncoder interface for WebRTC.
27 // It's responsible for getting  feedback on network bandwidth, latency & RTT
28 // and passing this information to the WebrtcVideoStream through the callbacks
29 // in WebrtcDummyVideoEncoderFactory. Video frames are captured and encoded
30 // outside of this dummy encoder (in WebrtcVideoEncoder called from
31 // WebrtcVideoStream). They are passed to SendEncodedFrame() to be delivered to
32 // the network layer.
33 class WebrtcDummyVideoEncoder : public webrtc::VideoEncoder {
34  public:
35   enum State { kUninitialized = 0, kInitialized };
36 
37   WebrtcDummyVideoEncoder(
38       scoped_refptr<base::SingleThreadTaskRunner> main_task_runner,
39       base::WeakPtr<VideoChannelStateObserver> video_channel_state_observer,
40       WebrtcDummyVideoEncoderFactory* factory);
41   ~WebrtcDummyVideoEncoder() override;
42 
43   // webrtc::VideoEncoder overrides.
44   int32_t InitEncode(const webrtc::VideoCodec* codec_settings,
45                      int32_t number_of_cores,
46                      size_t max_payload_size) override;
47   int32_t RegisterEncodeCompleteCallback(
48       webrtc::EncodedImageCallback* callback) override;
49   int32_t Release() override;
50   int32_t Encode(
51       const webrtc::VideoFrame& frame,
52       const std::vector<webrtc::VideoFrameType>* frame_types) override;
53   void SetRates(const RateControlParameters& parameters) override;
54   webrtc::VideoEncoder::EncoderInfo GetEncoderInfo() const override;
55 
56   webrtc::EncodedImageCallback::Result SendEncodedFrame(
57       const WebrtcVideoEncoder::EncodedFrame& frame,
58       base::TimeTicks capture_time,
59       base::TimeTicks encode_started_time,
60       base::TimeTicks encode_finished_time);
61 
62  private:
63   scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
64 
65   // Protects |encoded_callback_| and |state_|.
66   base::Lock lock_;
67   State state_;
68   webrtc::EncodedImageCallback* encoded_callback_ = nullptr;
69 
70   base::WeakPtr<VideoChannelStateObserver> video_channel_state_observer_;
71 
72   // Holds a reference to the creating factory, if any. Will be notified
73   // when this instance is released, so it can stop delivering frames.
74   WebrtcDummyVideoEncoderFactory* factory_ = nullptr;
75 };
76 
77 // This is the encoder factory implementation that is passed to
78 // WebRTC at the time of creation of peer connection. The encoder
79 // factory primarily manages creation of encoder.
80 class WebrtcDummyVideoEncoderFactory : public webrtc::VideoEncoderFactory {
81  public:
82   WebrtcDummyVideoEncoderFactory();
83   ~WebrtcDummyVideoEncoderFactory() override;
84 
85   // webrtc::VideoEncoderFactory interface.
86   std::unique_ptr<webrtc::VideoEncoder> CreateVideoEncoder(
87       const webrtc::SdpVideoFormat& format) override;
88   std::vector<webrtc::SdpVideoFormat> GetSupportedFormats() const override;
89   CodecInfo QueryVideoEncoder(
90       const webrtc::SdpVideoFormat& format) const override;
91 
92   webrtc::EncodedImageCallback::Result SendEncodedFrame(
93       const WebrtcVideoEncoder::EncodedFrame& packet,
94       base::TimeTicks capture_time,
95       base::TimeTicks encode_started_time,
96       base::TimeTicks encode_finished_time);
97 
98   // Callback will be called once the dummy encoder has been created on
99   // |main_task_runner_|.
100   void RegisterEncoderSelectedCallback(
101       const base::RepeatingCallback<
102           void(webrtc::VideoCodecType,
103                const webrtc::SdpVideoFormat::Parameters&)>& callback);
104 
105   void SetVideoChannelStateObserver(
106       base::WeakPtr<VideoChannelStateObserver> video_channel_state_observer);
107   base::WeakPtr<VideoChannelStateObserver>
get_video_channel_state_observer_for_tests()108   get_video_channel_state_observer_for_tests() {
109     return video_channel_state_observer_;
110   }
111 
112   void EncoderDestroyed(WebrtcDummyVideoEncoder* encoder);
113 
114  private:
115   scoped_refptr<base::SingleThreadTaskRunner> main_task_runner_;
116 
117   std::vector<webrtc::SdpVideoFormat> formats_;
118 
119   // Protects |video_channel_state_observer_| and |encoders_|.
120   base::Lock lock_;
121   base::WeakPtr<VideoChannelStateObserver> video_channel_state_observer_;
122   std::vector<WebrtcDummyVideoEncoder*> encoders_;
123   base::RepeatingCallback<void(webrtc::VideoCodecType,
124                                const webrtc::SdpVideoFormat::Parameters&)>
125       encoder_created_callback_;
126 };
127 
128 }  // namespace protocol
129 }  // namespace remoting
130 
131 #endif  // REMOTING_PROTOCOL_WEBRTC_DUMMY_VIDEO_ENCODER_H_
132