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