blob: 49ac1002bd0710c79c49068e8189345cb4679de1 [file] [log] [blame]
eladalonf1841382017-06-12 01:16:46 -07001/*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_
12#define MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_
eladalonf1841382017-06-12 01:16:46 -070013
14#include <map>
15#include <memory>
16#include <set>
17#include <string>
18#include <vector>
19
Danil Chapovalov00c71832018-06-15 15:58:38 +020020#include "absl/types/optional.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "api/call/transport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020022#include "api/video/video_frame.h"
Niels Möllerc6ce9c52018-05-11 11:15:30 +020023#include "api/video/video_sink_interface.h"
Niels Möller0327c2d2018-05-21 14:09:31 +020024#include "api/video/video_source_interface.h"
25#include "api/video_codecs/sdp_video_format.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020026#include "call/call.h"
27#include "call/flexfec_receive_stream.h"
28#include "call/video_receive_stream.h"
29#include "call/video_send_stream.h"
30#include "media/base/mediaengine.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020031#include "media/engine/webrtcvideodecoderfactory.h"
32#include "media/engine/webrtcvideoencoderfactory.h"
33#include "rtc_base/asyncinvoker.h"
34#include "rtc_base/criticalsection.h"
35#include "rtc_base/networkroute.h"
36#include "rtc_base/thread_annotations.h"
37#include "rtc_base/thread_checker.h"
eladalonf1841382017-06-12 01:16:46 -070038
39namespace webrtc {
40class VideoDecoder;
Magnus Jedvertd4b0c052017-09-14 10:24:54 +020041class VideoDecoderFactory;
eladalonf1841382017-06-12 01:16:46 -070042class VideoEncoder;
Magnus Jedvertd4b0c052017-09-14 10:24:54 +020043class VideoEncoderFactory;
eladalonf1841382017-06-12 01:16:46 -070044struct MediaConfig;
Yves Gerey665174f2018-06-19 15:03:05 +020045} // namespace webrtc
eladalonf1841382017-06-12 01:16:46 -070046
47namespace rtc {
48class Thread;
49} // namespace rtc
50
51namespace cricket {
52
eladalonf1841382017-06-12 01:16:46 -070053class WebRtcVideoChannel;
eladalonf1841382017-06-12 01:16:46 -070054
eladalonf1841382017-06-12 01:16:46 -070055class UnsignalledSsrcHandler {
56 public:
57 enum Action {
58 kDropPacket,
59 kDeliverPacket,
60 };
61 virtual Action OnUnsignalledSsrc(WebRtcVideoChannel* channel,
62 uint32_t ssrc) = 0;
63 virtual ~UnsignalledSsrcHandler() = default;
64};
65
66// TODO(pbos): Remove, use external handlers only.
67class DefaultUnsignalledSsrcHandler : public UnsignalledSsrcHandler {
68 public:
69 DefaultUnsignalledSsrcHandler();
Yves Gerey665174f2018-06-19 15:03:05 +020070 Action OnUnsignalledSsrc(WebRtcVideoChannel* channel, uint32_t ssrc) override;
eladalonf1841382017-06-12 01:16:46 -070071
72 rtc::VideoSinkInterface<webrtc::VideoFrame>* GetDefaultSink() const;
73 void SetDefaultSink(WebRtcVideoChannel* channel,
74 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
75
76 virtual ~DefaultUnsignalledSsrcHandler() = default;
77
78 private:
79 rtc::VideoSinkInterface<webrtc::VideoFrame>* default_sink_;
80};
81
82// WebRtcVideoEngine is used for the new native WebRTC Video API (webrtc:1667).
83class WebRtcVideoEngine {
84 public:
Anders Carlssondd8c1652018-01-30 10:32:13 +010085#if defined(USE_BUILTIN_SW_CODECS)
Magnus Jedvert02e7a192017-09-23 17:21:32 +020086 // Internal SW video codecs will be added on top of the external codecs.
87 WebRtcVideoEngine(
88 std::unique_ptr<WebRtcVideoEncoderFactory> external_video_encoder_factory,
89 std::unique_ptr<WebRtcVideoDecoderFactory>
90 external_video_decoder_factory);
Anders Carlssondd8c1652018-01-30 10:32:13 +010091#endif
Magnus Jedvertd4b0c052017-09-14 10:24:54 +020092
93 // These video codec factories represents all video codecs, i.e. both software
94 // and external hardware codecs.
95 WebRtcVideoEngine(
96 std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
97 std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory);
98
eladalonf1841382017-06-12 01:16:46 -070099 virtual ~WebRtcVideoEngine();
100
eladalonf1841382017-06-12 01:16:46 -0700101 WebRtcVideoChannel* CreateChannel(webrtc::Call* call,
102 const MediaConfig& config,
103 const VideoOptions& options);
104
105 std::vector<VideoCodec> codecs() const;
106 RtpCapabilities GetCapabilities() const;
107
eladalonf1841382017-06-12 01:16:46 -0700108 private:
Magnus Jedvert59ab3532018-09-03 18:07:56 +0200109 const std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory_;
Magnus Jedvert07e0d012017-10-31 11:24:54 +0100110 const std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
eladalonf1841382017-06-12 01:16:46 -0700111};
112
113class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
114 public:
115 WebRtcVideoChannel(webrtc::Call* call,
116 const MediaConfig& config,
117 const VideoOptions& options,
Magnus Jedvert07e0d012017-10-31 11:24:54 +0100118 webrtc::VideoEncoderFactory* encoder_factory,
Magnus Jedvert59ab3532018-09-03 18:07:56 +0200119 webrtc::VideoDecoderFactory* decoder_factory);
eladalonf1841382017-06-12 01:16:46 -0700120 ~WebRtcVideoChannel() override;
121
122 // VideoMediaChannel implementation
123 rtc::DiffServCodePoint PreferredDscp() const override;
124
125 bool SetSendParameters(const VideoSendParameters& params) override;
126 bool SetRecvParameters(const VideoRecvParameters& params) override;
127 webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override;
Zach Steinba37b4b2018-01-23 15:02:36 -0800128 webrtc::RTCError SetRtpSendParameters(
129 uint32_t ssrc,
130 const webrtc::RtpParameters& parameters) override;
eladalonf1841382017-06-12 01:16:46 -0700131 webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override;
132 bool SetRtpReceiveParameters(
133 uint32_t ssrc,
134 const webrtc::RtpParameters& parameters) override;
135 bool GetSendCodec(VideoCodec* send_codec) override;
136 bool SetSend(bool send) override;
137 bool SetVideoSend(
138 uint32_t ssrc,
eladalonf1841382017-06-12 01:16:46 -0700139 const VideoOptions* options,
140 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) override;
141 bool AddSendStream(const StreamParams& sp) override;
142 bool RemoveSendStream(uint32_t ssrc) override;
143 bool AddRecvStream(const StreamParams& sp) override;
144 bool AddRecvStream(const StreamParams& sp, bool default_stream);
145 bool RemoveRecvStream(uint32_t ssrc) override;
146 bool SetSink(uint32_t ssrc,
147 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
148 void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override;
149 bool GetStats(VideoMediaInfo* info) override;
150
151 void OnPacketReceived(rtc::CopyOnWriteBuffer* packet,
152 const rtc::PacketTime& packet_time) override;
153 void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet,
154 const rtc::PacketTime& packet_time) override;
155 void OnReadyToSend(bool ready) override;
156 void OnNetworkRouteChanged(const std::string& transport_name,
157 const rtc::NetworkRoute& network_route) override;
eladalonf1841382017-06-12 01:16:46 -0700158 void SetInterface(NetworkInterface* iface) override;
159
160 // Implemented for VideoMediaChannelTest.
161 bool sending() const { return sending_; }
162
Danil Chapovalov00c71832018-06-15 15:58:38 +0200163 absl::optional<uint32_t> GetDefaultReceiveStreamSsrc();
eladalonf1841382017-06-12 01:16:46 -0700164
Seth Hampson5897a6e2018-04-03 11:16:33 -0700165 StreamParams unsignaled_stream_params() { return unsignaled_stream_params_; }
166
eladalonf1841382017-06-12 01:16:46 -0700167 // AdaptReason is used for expressing why a WebRtcVideoSendStream request
168 // a lower input frame size than the currently configured camera input frame
169 // size. There can be more than one reason OR:ed together.
170 enum AdaptReason {
171 ADAPTREASON_NONE = 0,
172 ADAPTREASON_CPU = 1,
173 ADAPTREASON_BANDWIDTH = 2,
174 };
175
sprang67561a62017-06-15 06:34:42 -0700176 static constexpr int kDefaultQpMax = 56;
177
eladalonf1841382017-06-12 01:16:46 -0700178 private:
179 class WebRtcVideoReceiveStream;
180 struct VideoCodecSettings {
181 VideoCodecSettings();
182
183 // Checks if all members of |*this| are equal to the corresponding members
184 // of |other|.
185 bool operator==(const VideoCodecSettings& other) const;
186 bool operator!=(const VideoCodecSettings& other) const;
187
188 // Checks if all members of |a|, except |flexfec_payload_type|, are equal
189 // to the corresponding members of |b|.
190 static bool EqualsDisregardingFlexfec(const VideoCodecSettings& a,
191 const VideoCodecSettings& b);
192
193 VideoCodec codec;
194 webrtc::UlpfecConfig ulpfec;
195 int flexfec_payload_type;
196 int rtx_payload_type;
197 };
198
199 struct ChangedSendParameters {
200 // These optionals are unset if not changed.
Danil Chapovalov00c71832018-06-15 15:58:38 +0200201 absl::optional<VideoCodecSettings> codec;
202 absl::optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
203 absl::optional<std::string> mid;
204 absl::optional<int> max_bandwidth_bps;
205 absl::optional<bool> conference_mode;
206 absl::optional<webrtc::RtcpMode> rtcp_mode;
eladalonf1841382017-06-12 01:16:46 -0700207 };
208
209 struct ChangedRecvParameters {
210 // These optionals are unset if not changed.
Danil Chapovalov00c71832018-06-15 15:58:38 +0200211 absl::optional<std::vector<VideoCodecSettings>> codec_settings;
212 absl::optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
eladalonf1841382017-06-12 01:16:46 -0700213 // Keep track of the FlexFEC payload type separately from |codec_settings|.
214 // This allows us to recreate the FlexfecReceiveStream separately from the
215 // VideoReceiveStream when the FlexFEC payload type is changed.
Danil Chapovalov00c71832018-06-15 15:58:38 +0200216 absl::optional<int> flexfec_payload_type;
eladalonf1841382017-06-12 01:16:46 -0700217 };
218
219 bool GetChangedSendParameters(const VideoSendParameters& params,
220 ChangedSendParameters* changed_params) const;
221 bool GetChangedRecvParameters(const VideoRecvParameters& params,
222 ChangedRecvParameters* changed_params) const;
223
224 void SetMaxSendBandwidth(int bps);
225
226 void ConfigureReceiverRtp(
227 webrtc::VideoReceiveStream::Config* config,
228 webrtc::FlexfecReceiveStream::Config* flexfec_config,
229 const StreamParams& sp) const;
230 bool ValidateSendSsrcAvailability(const StreamParams& sp) const
danilchapa37de392017-09-09 04:17:22 -0700231 RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700232 bool ValidateReceiveSsrcAvailability(const StreamParams& sp) const
danilchapa37de392017-09-09 04:17:22 -0700233 RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700234 void DeleteReceiveStream(WebRtcVideoReceiveStream* stream)
danilchapa37de392017-09-09 04:17:22 -0700235 RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700236
237 static std::string CodecSettingsVectorToString(
238 const std::vector<VideoCodecSettings>& codecs);
239
240 // Wrapper for the sender part.
241 class WebRtcVideoSendStream
242 : public rtc::VideoSourceInterface<webrtc::VideoFrame> {
243 public:
244 WebRtcVideoSendStream(
245 webrtc::Call* call,
246 const StreamParams& sp,
247 webrtc::VideoSendStream::Config config,
248 const VideoOptions& options,
eladalonf1841382017-06-12 01:16:46 -0700249 bool enable_cpu_overuse_detection,
250 int max_bitrate_bps,
Danil Chapovalov00c71832018-06-15 15:58:38 +0200251 const absl::optional<VideoCodecSettings>& codec_settings,
252 const absl::optional<std::vector<webrtc::RtpExtension>>& rtp_extensions,
eladalonf1841382017-06-12 01:16:46 -0700253 const VideoSendParameters& send_params);
254 virtual ~WebRtcVideoSendStream();
255
256 void SetSendParameters(const ChangedSendParameters& send_params);
Zach Steinba37b4b2018-01-23 15:02:36 -0800257 webrtc::RTCError SetRtpParameters(const webrtc::RtpParameters& parameters);
eladalonf1841382017-06-12 01:16:46 -0700258 webrtc::RtpParameters GetRtpParameters() const;
259
260 // Implements rtc::VideoSourceInterface<webrtc::VideoFrame>.
261 // WebRtcVideoSendStream acts as a source to the webrtc::VideoSendStream
262 // in |stream_|. This is done to proxy VideoSinkWants from the encoder to
263 // the worker thread.
264 void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
265 const rtc::VideoSinkWants& wants) override;
266 void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
267
Niels Möllerff40b142018-04-09 08:49:14 +0200268 bool SetVideoSend(const VideoOptions* options,
eladalonf1841382017-06-12 01:16:46 -0700269 rtc::VideoSourceInterface<webrtc::VideoFrame>* source);
270
271 void SetSend(bool send);
272
273 const std::vector<uint32_t>& GetSsrcs() const;
274 VideoSenderInfo GetVideoSenderInfo(bool log_stats);
275 void FillBitrateInfo(BandwidthEstimationInfo* bwe_info);
276
277 private:
278 // Parameters needed to reconstruct the underlying stream.
279 // webrtc::VideoSendStream doesn't support setting a lot of options on the
280 // fly, so when those need to be changed we tear down and reconstruct with
281 // similar parameters depending on which options changed etc.
282 struct VideoSendStreamParameters {
283 VideoSendStreamParameters(
284 webrtc::VideoSendStream::Config config,
285 const VideoOptions& options,
286 int max_bitrate_bps,
Danil Chapovalov00c71832018-06-15 15:58:38 +0200287 const absl::optional<VideoCodecSettings>& codec_settings);
eladalonf1841382017-06-12 01:16:46 -0700288 webrtc::VideoSendStream::Config config;
289 VideoOptions options;
290 int max_bitrate_bps;
291 bool conference_mode;
Danil Chapovalov00c71832018-06-15 15:58:38 +0200292 absl::optional<VideoCodecSettings> codec_settings;
eladalonf1841382017-06-12 01:16:46 -0700293 // Sent resolutions + bitrates etc. by the underlying VideoSendStream,
294 // typically changes when setting a new resolution or reconfiguring
295 // bitrates.
296 webrtc::VideoEncoderConfig encoder_config;
297 };
298
eladalonf1841382017-06-12 01:16:46 -0700299 rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
300 ConfigureVideoEncoderSettings(const VideoCodec& codec);
Niels Möller5bf8ccd2018-03-15 14:16:11 +0100301 void SetCodec(const VideoCodecSettings& codec);
eladalonf1841382017-06-12 01:16:46 -0700302 void RecreateWebRtcStream();
303 webrtc::VideoEncoderConfig CreateVideoEncoderConfig(
304 const VideoCodec& codec) const;
305 void ReconfigureEncoder();
Zach Steinba37b4b2018-01-23 15:02:36 -0800306 webrtc::RTCError ValidateRtpParameters(
307 const webrtc::RtpParameters& parameters);
eladalonf1841382017-06-12 01:16:46 -0700308
309 // Calls Start or Stop according to whether or not |sending_| is true,
310 // and whether or not the encoding in |rtp_parameters_| is active.
311 void UpdateSendState();
312
Taylor Brandstetter49fcc102018-05-16 14:20:41 -0700313 webrtc::DegradationPreference GetDegradationPreference() const
314 RTC_EXCLUSIVE_LOCKS_REQUIRED(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700315
316 rtc::ThreadChecker thread_checker_;
317 rtc::AsyncInvoker invoker_;
318 rtc::Thread* worker_thread_;
Niels Möller1e062892018-02-07 10:18:32 +0100319 const std::vector<uint32_t> ssrcs_ RTC_GUARDED_BY(&thread_checker_);
320 const std::vector<SsrcGroup> ssrc_groups_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700321 webrtc::Call* const call_;
322 const bool enable_cpu_overuse_detection_;
323 rtc::VideoSourceInterface<webrtc::VideoFrame>* source_
Niels Möller1e062892018-02-07 10:18:32 +0100324 RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700325
Niels Möller1e062892018-02-07 10:18:32 +0100326 webrtc::VideoSendStream* stream_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700327 rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_
Niels Möller1e062892018-02-07 10:18:32 +0100328 RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700329 // Contains settings that are the same for all streams in the MediaChannel,
330 // such as codecs, header extensions, and the global bitrate limit for the
331 // entire channel.
Niels Möller1e062892018-02-07 10:18:32 +0100332 VideoSendStreamParameters parameters_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700333 // Contains settings that are unique for each stream, such as max_bitrate.
334 // Does *not* contain codecs, however.
335 // TODO(skvlad): Move ssrcs_ and ssrc_groups_ into rtp_parameters_.
336 // TODO(skvlad): Combine parameters_ and rtp_parameters_ once we have only
337 // one stream per MediaChannel.
Niels Möller1e062892018-02-07 10:18:32 +0100338 webrtc::RtpParameters rtp_parameters_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700339
Niels Möller1e062892018-02-07 10:18:32 +0100340 bool sending_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700341 };
342
343 // Wrapper for the receiver part, contains configs etc. that are needed to
344 // reconstruct the underlying VideoReceiveStream.
345 class WebRtcVideoReceiveStream
346 : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
347 public:
348 WebRtcVideoReceiveStream(
349 webrtc::Call* call,
350 const StreamParams& sp,
351 webrtc::VideoReceiveStream::Config config,
Magnus Jedvert59ab3532018-09-03 18:07:56 +0200352 webrtc::VideoDecoderFactory* decoder_factory,
eladalonf1841382017-06-12 01:16:46 -0700353 bool default_stream,
354 const std::vector<VideoCodecSettings>& recv_codecs,
355 const webrtc::FlexfecReceiveStream::Config& flexfec_config);
356 ~WebRtcVideoReceiveStream();
357
358 const std::vector<uint32_t>& GetSsrcs() const;
Florent Castelliabe301f2018-06-12 18:33:49 +0200359
360 // Does not return codecs, they are filled by the owning WebRtcVideoChannel.
361 webrtc::RtpParameters GetRtpParameters() const;
eladalonf1841382017-06-12 01:16:46 -0700362
363 void SetLocalSsrc(uint32_t local_ssrc);
364 // TODO(deadbeef): Move these feedback parameters into the recv parameters.
365 void SetFeedbackParameters(bool nack_enabled,
366 bool remb_enabled,
367 bool transport_cc_enabled,
368 webrtc::RtcpMode rtcp_mode);
369 void SetRecvParameters(const ChangedRecvParameters& recv_params);
370
371 void OnFrame(const webrtc::VideoFrame& frame) override;
372 bool IsDefaultStream() const;
373
374 void SetSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
375
376 VideoReceiverInfo GetVideoReceiverInfo(bool log_stats);
377
378 private:
andersc063f0c02017-09-11 11:50:51 -0700379 struct SdpVideoFormatCompare {
380 bool operator()(const webrtc::SdpVideoFormat& lhs,
381 const webrtc::SdpVideoFormat& rhs) const {
382 return std::tie(lhs.name, lhs.parameters) <
383 std::tie(rhs.name, rhs.parameters);
384 }
perkj1f885312017-09-04 02:43:10 -0700385 };
andersc063f0c02017-09-11 11:50:51 -0700386 typedef std::map<webrtc::SdpVideoFormat,
387 std::unique_ptr<webrtc::VideoDecoder>,
388 SdpVideoFormatCompare>
389 DecoderMap;
perkj1f885312017-09-04 02:43:10 -0700390
eladalonf1841382017-06-12 01:16:46 -0700391 void RecreateWebRtcVideoStream();
392 void MaybeRecreateWebRtcFlexfecStream();
393
eladalonc0d481a2017-08-02 07:39:07 -0700394 void MaybeAssociateFlexfecWithVideo();
395 void MaybeDissociateFlexfecFromVideo();
396
perkj1f885312017-09-04 02:43:10 -0700397 void ConfigureCodecs(const std::vector<VideoCodecSettings>& recv_codecs,
andersc063f0c02017-09-11 11:50:51 -0700398 DecoderMap* old_codecs);
eladalonf1841382017-06-12 01:16:46 -0700399 void ConfigureFlexfecCodec(int flexfec_payload_type);
eladalonf1841382017-06-12 01:16:46 -0700400
401 std::string GetCodecNameFromPayloadType(int payload_type);
402
Danil Chapovalov00c71832018-06-15 15:58:38 +0200403 absl::optional<uint32_t> GetFirstPrimarySsrc() const;
Florent Castelliabe301f2018-06-12 18:33:49 +0200404
eladalonf1841382017-06-12 01:16:46 -0700405 webrtc::Call* const call_;
406 StreamParams stream_params_;
407
408 // Both |stream_| and |flexfec_stream_| are managed by |this|. They are
409 // destroyed by calling call_->DestroyVideoReceiveStream and
410 // call_->DestroyFlexfecReceiveStream, respectively.
411 webrtc::VideoReceiveStream* stream_;
412 const bool default_stream_;
413 webrtc::VideoReceiveStream::Config config_;
414 webrtc::FlexfecReceiveStream::Config flexfec_config_;
415 webrtc::FlexfecReceiveStream* flexfec_stream_;
416
Magnus Jedvert59ab3532018-09-03 18:07:56 +0200417 webrtc::VideoDecoderFactory* decoder_factory_;
andersc063f0c02017-09-11 11:50:51 -0700418 DecoderMap allocated_decoders_;
eladalonf1841382017-06-12 01:16:46 -0700419
420 rtc::CriticalSection sink_lock_;
danilchapa37de392017-09-09 04:17:22 -0700421 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink_
422 RTC_GUARDED_BY(sink_lock_);
eladalonf1841382017-06-12 01:16:46 -0700423 // Expands remote RTP timestamps to int64_t to be able to estimate how long
424 // the stream has been running.
425 rtc::TimestampWrapAroundHandler timestamp_wraparound_handler_
danilchapa37de392017-09-09 04:17:22 -0700426 RTC_GUARDED_BY(sink_lock_);
427 int64_t first_frame_timestamp_ RTC_GUARDED_BY(sink_lock_);
eladalonf1841382017-06-12 01:16:46 -0700428 // Start NTP time is estimated as current remote NTP time (estimated from
429 // RTCP) minus the elapsed time, as soon as remote NTP time is available.
danilchapa37de392017-09-09 04:17:22 -0700430 int64_t estimated_remote_start_ntp_time_ms_ RTC_GUARDED_BY(sink_lock_);
eladalonf1841382017-06-12 01:16:46 -0700431 };
432
433 void Construct(webrtc::Call* call, WebRtcVideoEngine* engine);
434
435 bool SendRtp(const uint8_t* data,
436 size_t len,
437 const webrtc::PacketOptions& options) override;
438 bool SendRtcp(const uint8_t* data, size_t len) override;
439
440 static std::vector<VideoCodecSettings> MapCodecs(
441 const std::vector<VideoCodec>& codecs);
442 // Select what video codec will be used for sending, i.e. what codec is used
443 // for local encoding, based on supported remote codecs. The first remote
444 // codec that is supported locally will be selected.
Danil Chapovalov00c71832018-06-15 15:58:38 +0200445 absl::optional<VideoCodecSettings> SelectSendVideoCodec(
eladalonf1841382017-06-12 01:16:46 -0700446 const std::vector<VideoCodecSettings>& remote_mapped_codecs) const;
447
448 static bool NonFlexfecReceiveCodecsHaveChanged(
449 std::vector<VideoCodecSettings> before,
450 std::vector<VideoCodecSettings> after);
451
452 void FillSenderStats(VideoMediaInfo* info, bool log_stats);
453 void FillReceiverStats(VideoMediaInfo* info, bool log_stats);
454 void FillBandwidthEstimationStats(const webrtc::Call::Stats& stats,
455 VideoMediaInfo* info);
456 void FillSendAndReceiveCodecStats(VideoMediaInfo* video_media_info);
457
458 rtc::ThreadChecker thread_checker_;
459
460 uint32_t rtcp_receiver_report_ssrc_;
461 bool sending_;
462 webrtc::Call* const call_;
463
464 DefaultUnsignalledSsrcHandler default_unsignalled_ssrc_handler_;
465 UnsignalledSsrcHandler* const unsignalled_ssrc_handler_;
466
467 const MediaConfig::Video video_config_;
468
469 rtc::CriticalSection stream_crit_;
470 // Using primary-ssrc (first ssrc) as key.
471 std::map<uint32_t, WebRtcVideoSendStream*> send_streams_
danilchapa37de392017-09-09 04:17:22 -0700472 RTC_GUARDED_BY(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700473 std::map<uint32_t, WebRtcVideoReceiveStream*> receive_streams_
danilchapa37de392017-09-09 04:17:22 -0700474 RTC_GUARDED_BY(stream_crit_);
475 std::set<uint32_t> send_ssrcs_ RTC_GUARDED_BY(stream_crit_);
476 std::set<uint32_t> receive_ssrcs_ RTC_GUARDED_BY(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700477
Danil Chapovalov00c71832018-06-15 15:58:38 +0200478 absl::optional<VideoCodecSettings> send_codec_;
479 absl::optional<std::vector<webrtc::RtpExtension>> send_rtp_extensions_;
eladalonf1841382017-06-12 01:16:46 -0700480
Magnus Jedvert07e0d012017-10-31 11:24:54 +0100481 webrtc::VideoEncoderFactory* const encoder_factory_;
Magnus Jedvert59ab3532018-09-03 18:07:56 +0200482 webrtc::VideoDecoderFactory* const decoder_factory_;
eladalonf1841382017-06-12 01:16:46 -0700483 std::vector<VideoCodecSettings> recv_codecs_;
484 std::vector<webrtc::RtpExtension> recv_rtp_extensions_;
485 // See reason for keeping track of the FlexFEC payload type separately in
486 // comment in WebRtcVideoChannel::ChangedRecvParameters.
487 int recv_flexfec_payload_type_;
Sebastian Janssonfc8d26b2018-02-21 09:52:06 +0100488 webrtc::BitrateConstraints bitrate_config_;
eladalonf1841382017-06-12 01:16:46 -0700489 // TODO(deadbeef): Don't duplicate information between
490 // send_params/recv_params, rtp_extensions, options, etc.
491 VideoSendParameters send_params_;
492 VideoOptions default_send_options_;
493 VideoRecvParameters recv_params_;
494 int64_t last_stats_log_ms_;
Seth Hampson5897a6e2018-04-03 11:16:33 -0700495 // This is a stream param that comes from the remote description, but wasn't
496 // signaled with any a=ssrc lines. It holds information that was signaled
497 // before the unsignaled receive stream is created when the first packet is
498 // received.
499 StreamParams unsignaled_stream_params_;
eladalonf1841382017-06-12 01:16:46 -0700500};
501
ilnik6b826ef2017-06-16 06:53:48 -0700502class EncoderStreamFactory
503 : public webrtc::VideoEncoderConfig::VideoStreamFactoryInterface {
504 public:
505 EncoderStreamFactory(std::string codec_name,
506 int max_qp,
Seth Hampson1370e302018-02-07 08:50:36 -0800507 bool is_screenshare,
508 bool screenshare_config_explicitly_enabled);
ilnik6b826ef2017-06-16 06:53:48 -0700509
510 private:
511 std::vector<webrtc::VideoStream> CreateEncoderStreams(
512 int width,
513 int height,
514 const webrtc::VideoEncoderConfig& encoder_config) override;
515
516 const std::string codec_name_;
517 const int max_qp_;
Seth Hampson1370e302018-02-07 08:50:36 -0800518 const bool is_screenshare_;
519 // Allows a screenshare specific configuration, which enables temporal
520 // layering and allows simulcast.
521 const bool screenshare_config_explicitly_enabled_;
ilnik6b826ef2017-06-16 06:53:48 -0700522};
523
eladalonf1841382017-06-12 01:16:46 -0700524} // namespace cricket
525
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200526#endif // MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_