blob: 15ff4efa0c110e891fb675b5cb20d52dbbf00b26 [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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "api/call/transport.h"
21#include "api/optional.h"
22#include "api/video/video_frame.h"
23#include "api/video_codecs/sdp_video_format.h"
Niels Möllerc6ce9c52018-05-11 11:15:30 +020024#include "api/video/video_sink_interface.h"
Patrik Höglund9e194032018-01-04 15:58:20 +010025#include "api/videosourceinterface.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;
45}
46
47namespace rtc {
48class Thread;
49} // namespace rtc
50
51namespace cricket {
52
andersc063f0c02017-09-11 11:50:51 -070053class DecoderFactoryAdapter;
eladalonf1841382017-06-12 01:16:46 -070054class VideoCapturer;
55class VideoProcessor;
56class VideoRenderer;
57class VoiceMediaChannel;
58class WebRtcDecoderObserver;
59class WebRtcEncoderObserver;
60class WebRtcLocalStreamInfo;
61class WebRtcRenderAdapter;
62class WebRtcVideoChannel;
63class WebRtcVideoChannelRecvInfo;
64class WebRtcVideoChannelSendInfo;
65class WebRtcVoiceEngine;
66class WebRtcVoiceMediaChannel;
67
eladalonf1841382017-06-12 01:16:46 -070068class UnsignalledSsrcHandler {
69 public:
70 enum Action {
71 kDropPacket,
72 kDeliverPacket,
73 };
74 virtual Action OnUnsignalledSsrc(WebRtcVideoChannel* channel,
75 uint32_t ssrc) = 0;
76 virtual ~UnsignalledSsrcHandler() = default;
77};
78
79// TODO(pbos): Remove, use external handlers only.
80class DefaultUnsignalledSsrcHandler : public UnsignalledSsrcHandler {
81 public:
82 DefaultUnsignalledSsrcHandler();
83 Action OnUnsignalledSsrc(WebRtcVideoChannel* channel,
84 uint32_t ssrc) override;
85
86 rtc::VideoSinkInterface<webrtc::VideoFrame>* GetDefaultSink() const;
87 void SetDefaultSink(WebRtcVideoChannel* channel,
88 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
89
90 virtual ~DefaultUnsignalledSsrcHandler() = default;
91
92 private:
93 rtc::VideoSinkInterface<webrtc::VideoFrame>* default_sink_;
94};
95
96// WebRtcVideoEngine is used for the new native WebRTC Video API (webrtc:1667).
97class WebRtcVideoEngine {
98 public:
Anders Carlssondd8c1652018-01-30 10:32:13 +010099#if defined(USE_BUILTIN_SW_CODECS)
Magnus Jedvert02e7a192017-09-23 17:21:32 +0200100 // Internal SW video codecs will be added on top of the external codecs.
101 WebRtcVideoEngine(
102 std::unique_ptr<WebRtcVideoEncoderFactory> external_video_encoder_factory,
103 std::unique_ptr<WebRtcVideoDecoderFactory>
104 external_video_decoder_factory);
Anders Carlssondd8c1652018-01-30 10:32:13 +0100105#endif
Magnus Jedvertd4b0c052017-09-14 10:24:54 +0200106
107 // These video codec factories represents all video codecs, i.e. both software
108 // and external hardware codecs.
109 WebRtcVideoEngine(
110 std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
111 std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory);
112
eladalonf1841382017-06-12 01:16:46 -0700113 virtual ~WebRtcVideoEngine();
114
eladalonf1841382017-06-12 01:16:46 -0700115 WebRtcVideoChannel* CreateChannel(webrtc::Call* call,
116 const MediaConfig& config,
117 const VideoOptions& options);
118
119 std::vector<VideoCodec> codecs() const;
120 RtpCapabilities GetCapabilities() const;
121
eladalonf1841382017-06-12 01:16:46 -0700122 private:
magjed2475ae22017-09-12 04:42:15 -0700123 const std::unique_ptr<DecoderFactoryAdapter> decoder_factory_;
Magnus Jedvert07e0d012017-10-31 11:24:54 +0100124 const std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
eladalonf1841382017-06-12 01:16:46 -0700125};
126
127class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
128 public:
129 WebRtcVideoChannel(webrtc::Call* call,
130 const MediaConfig& config,
131 const VideoOptions& options,
Magnus Jedvert07e0d012017-10-31 11:24:54 +0100132 webrtc::VideoEncoderFactory* encoder_factory,
133 DecoderFactoryAdapter* decoder_factory);
eladalonf1841382017-06-12 01:16:46 -0700134 ~WebRtcVideoChannel() override;
135
136 // VideoMediaChannel implementation
137 rtc::DiffServCodePoint PreferredDscp() const override;
138
139 bool SetSendParameters(const VideoSendParameters& params) override;
140 bool SetRecvParameters(const VideoRecvParameters& params) override;
141 webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override;
Zach Steinba37b4b2018-01-23 15:02:36 -0800142 webrtc::RTCError SetRtpSendParameters(
143 uint32_t ssrc,
144 const webrtc::RtpParameters& parameters) override;
eladalonf1841382017-06-12 01:16:46 -0700145 webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override;
146 bool SetRtpReceiveParameters(
147 uint32_t ssrc,
148 const webrtc::RtpParameters& parameters) override;
149 bool GetSendCodec(VideoCodec* send_codec) override;
150 bool SetSend(bool send) override;
151 bool SetVideoSend(
152 uint32_t ssrc,
eladalonf1841382017-06-12 01:16:46 -0700153 const VideoOptions* options,
154 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) override;
155 bool AddSendStream(const StreamParams& sp) override;
156 bool RemoveSendStream(uint32_t ssrc) override;
157 bool AddRecvStream(const StreamParams& sp) override;
158 bool AddRecvStream(const StreamParams& sp, bool default_stream);
159 bool RemoveRecvStream(uint32_t ssrc) override;
160 bool SetSink(uint32_t ssrc,
161 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
162 void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override;
163 bool GetStats(VideoMediaInfo* info) override;
164
165 void OnPacketReceived(rtc::CopyOnWriteBuffer* packet,
166 const rtc::PacketTime& packet_time) override;
167 void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet,
168 const rtc::PacketTime& packet_time) override;
169 void OnReadyToSend(bool ready) override;
170 void OnNetworkRouteChanged(const std::string& transport_name,
171 const rtc::NetworkRoute& network_route) override;
eladalonf1841382017-06-12 01:16:46 -0700172 void SetInterface(NetworkInterface* iface) override;
173
174 // Implemented for VideoMediaChannelTest.
175 bool sending() const { return sending_; }
176
177 rtc::Optional<uint32_t> GetDefaultReceiveStreamSsrc();
178
Seth Hampson5897a6e2018-04-03 11:16:33 -0700179 StreamParams unsignaled_stream_params() { return unsignaled_stream_params_; }
180
eladalonf1841382017-06-12 01:16:46 -0700181 // AdaptReason is used for expressing why a WebRtcVideoSendStream request
182 // a lower input frame size than the currently configured camera input frame
183 // size. There can be more than one reason OR:ed together.
184 enum AdaptReason {
185 ADAPTREASON_NONE = 0,
186 ADAPTREASON_CPU = 1,
187 ADAPTREASON_BANDWIDTH = 2,
188 };
189
sprang67561a62017-06-15 06:34:42 -0700190 static constexpr int kDefaultQpMax = 56;
191
eladalonf1841382017-06-12 01:16:46 -0700192 private:
193 class WebRtcVideoReceiveStream;
194 struct VideoCodecSettings {
195 VideoCodecSettings();
196
197 // Checks if all members of |*this| are equal to the corresponding members
198 // of |other|.
199 bool operator==(const VideoCodecSettings& other) const;
200 bool operator!=(const VideoCodecSettings& other) const;
201
202 // Checks if all members of |a|, except |flexfec_payload_type|, are equal
203 // to the corresponding members of |b|.
204 static bool EqualsDisregardingFlexfec(const VideoCodecSettings& a,
205 const VideoCodecSettings& b);
206
207 VideoCodec codec;
208 webrtc::UlpfecConfig ulpfec;
209 int flexfec_payload_type;
210 int rtx_payload_type;
211 };
212
213 struct ChangedSendParameters {
214 // These optionals are unset if not changed.
215 rtc::Optional<VideoCodecSettings> codec;
216 rtc::Optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
Steve Antonbb50ce52018-03-26 10:24:32 -0700217 rtc::Optional<std::string> mid;
eladalonf1841382017-06-12 01:16:46 -0700218 rtc::Optional<int> max_bandwidth_bps;
219 rtc::Optional<bool> conference_mode;
220 rtc::Optional<webrtc::RtcpMode> rtcp_mode;
221 };
222
223 struct ChangedRecvParameters {
224 // These optionals are unset if not changed.
225 rtc::Optional<std::vector<VideoCodecSettings>> codec_settings;
226 rtc::Optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
227 // Keep track of the FlexFEC payload type separately from |codec_settings|.
228 // This allows us to recreate the FlexfecReceiveStream separately from the
229 // VideoReceiveStream when the FlexFEC payload type is changed.
230 rtc::Optional<int> flexfec_payload_type;
231 };
232
233 bool GetChangedSendParameters(const VideoSendParameters& params,
234 ChangedSendParameters* changed_params) const;
235 bool GetChangedRecvParameters(const VideoRecvParameters& params,
236 ChangedRecvParameters* changed_params) const;
237
238 void SetMaxSendBandwidth(int bps);
239
240 void ConfigureReceiverRtp(
241 webrtc::VideoReceiveStream::Config* config,
242 webrtc::FlexfecReceiveStream::Config* flexfec_config,
243 const StreamParams& sp) const;
244 bool ValidateSendSsrcAvailability(const StreamParams& sp) const
danilchapa37de392017-09-09 04:17:22 -0700245 RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700246 bool ValidateReceiveSsrcAvailability(const StreamParams& sp) const
danilchapa37de392017-09-09 04:17:22 -0700247 RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700248 void DeleteReceiveStream(WebRtcVideoReceiveStream* stream)
danilchapa37de392017-09-09 04:17:22 -0700249 RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700250
251 static std::string CodecSettingsVectorToString(
252 const std::vector<VideoCodecSettings>& codecs);
253
254 // Wrapper for the sender part.
255 class WebRtcVideoSendStream
256 : public rtc::VideoSourceInterface<webrtc::VideoFrame> {
257 public:
258 WebRtcVideoSendStream(
259 webrtc::Call* call,
260 const StreamParams& sp,
261 webrtc::VideoSendStream::Config config,
262 const VideoOptions& options,
eladalonf1841382017-06-12 01:16:46 -0700263 bool enable_cpu_overuse_detection,
264 int max_bitrate_bps,
265 const rtc::Optional<VideoCodecSettings>& codec_settings,
266 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions,
267 const VideoSendParameters& send_params);
268 virtual ~WebRtcVideoSendStream();
269
270 void SetSendParameters(const ChangedSendParameters& send_params);
Zach Steinba37b4b2018-01-23 15:02:36 -0800271 webrtc::RTCError SetRtpParameters(const webrtc::RtpParameters& parameters);
eladalonf1841382017-06-12 01:16:46 -0700272 webrtc::RtpParameters GetRtpParameters() const;
273
274 // Implements rtc::VideoSourceInterface<webrtc::VideoFrame>.
275 // WebRtcVideoSendStream acts as a source to the webrtc::VideoSendStream
276 // in |stream_|. This is done to proxy VideoSinkWants from the encoder to
277 // the worker thread.
278 void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
279 const rtc::VideoSinkWants& wants) override;
280 void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
281
Niels Möllerff40b142018-04-09 08:49:14 +0200282 bool SetVideoSend(const VideoOptions* options,
eladalonf1841382017-06-12 01:16:46 -0700283 rtc::VideoSourceInterface<webrtc::VideoFrame>* source);
284
285 void SetSend(bool send);
286
287 const std::vector<uint32_t>& GetSsrcs() const;
288 VideoSenderInfo GetVideoSenderInfo(bool log_stats);
289 void FillBitrateInfo(BandwidthEstimationInfo* bwe_info);
290
291 private:
292 // Parameters needed to reconstruct the underlying stream.
293 // webrtc::VideoSendStream doesn't support setting a lot of options on the
294 // fly, so when those need to be changed we tear down and reconstruct with
295 // similar parameters depending on which options changed etc.
296 struct VideoSendStreamParameters {
297 VideoSendStreamParameters(
298 webrtc::VideoSendStream::Config config,
299 const VideoOptions& options,
300 int max_bitrate_bps,
301 const rtc::Optional<VideoCodecSettings>& codec_settings);
302 webrtc::VideoSendStream::Config config;
303 VideoOptions options;
304 int max_bitrate_bps;
305 bool conference_mode;
306 rtc::Optional<VideoCodecSettings> codec_settings;
307 // Sent resolutions + bitrates etc. by the underlying VideoSendStream,
308 // typically changes when setting a new resolution or reconfiguring
309 // bitrates.
310 webrtc::VideoEncoderConfig encoder_config;
311 };
312
eladalonf1841382017-06-12 01:16:46 -0700313 rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
314 ConfigureVideoEncoderSettings(const VideoCodec& codec);
Niels Möller5bf8ccd2018-03-15 14:16:11 +0100315 void SetCodec(const VideoCodecSettings& codec);
eladalonf1841382017-06-12 01:16:46 -0700316 void RecreateWebRtcStream();
317 webrtc::VideoEncoderConfig CreateVideoEncoderConfig(
318 const VideoCodec& codec) const;
319 void ReconfigureEncoder();
Zach Steinba37b4b2018-01-23 15:02:36 -0800320 webrtc::RTCError ValidateRtpParameters(
321 const webrtc::RtpParameters& parameters);
eladalonf1841382017-06-12 01:16:46 -0700322
323 // Calls Start or Stop according to whether or not |sending_| is true,
324 // and whether or not the encoding in |rtp_parameters_| is active.
325 void UpdateSendState();
326
327 webrtc::VideoSendStream::DegradationPreference GetDegradationPreference()
danilchapa37de392017-09-09 04:17:22 -0700328 const RTC_EXCLUSIVE_LOCKS_REQUIRED(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700329
330 rtc::ThreadChecker thread_checker_;
331 rtc::AsyncInvoker invoker_;
332 rtc::Thread* worker_thread_;
Niels Möller1e062892018-02-07 10:18:32 +0100333 const std::vector<uint32_t> ssrcs_ RTC_GUARDED_BY(&thread_checker_);
334 const std::vector<SsrcGroup> ssrc_groups_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700335 webrtc::Call* const call_;
336 const bool enable_cpu_overuse_detection_;
337 rtc::VideoSourceInterface<webrtc::VideoFrame>* source_
Niels Möller1e062892018-02-07 10:18:32 +0100338 RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700339
Niels Möller1e062892018-02-07 10:18:32 +0100340 webrtc::VideoSendStream* stream_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700341 rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_
Niels Möller1e062892018-02-07 10:18:32 +0100342 RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700343 // Contains settings that are the same for all streams in the MediaChannel,
344 // such as codecs, header extensions, and the global bitrate limit for the
345 // entire channel.
Niels Möller1e062892018-02-07 10:18:32 +0100346 VideoSendStreamParameters parameters_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700347 // Contains settings that are unique for each stream, such as max_bitrate.
348 // Does *not* contain codecs, however.
349 // TODO(skvlad): Move ssrcs_ and ssrc_groups_ into rtp_parameters_.
350 // TODO(skvlad): Combine parameters_ and rtp_parameters_ once we have only
351 // one stream per MediaChannel.
Niels Möller1e062892018-02-07 10:18:32 +0100352 webrtc::RtpParameters rtp_parameters_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700353
Niels Möller1e062892018-02-07 10:18:32 +0100354 bool sending_ RTC_GUARDED_BY(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700355 };
356
357 // Wrapper for the receiver part, contains configs etc. that are needed to
358 // reconstruct the underlying VideoReceiveStream.
359 class WebRtcVideoReceiveStream
360 : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
361 public:
362 WebRtcVideoReceiveStream(
363 webrtc::Call* call,
364 const StreamParams& sp,
365 webrtc::VideoReceiveStream::Config config,
Magnus Jedvert07e0d012017-10-31 11:24:54 +0100366 DecoderFactoryAdapter* decoder_factory,
eladalonf1841382017-06-12 01:16:46 -0700367 bool default_stream,
368 const std::vector<VideoCodecSettings>& recv_codecs,
369 const webrtc::FlexfecReceiveStream::Config& flexfec_config);
370 ~WebRtcVideoReceiveStream();
371
372 const std::vector<uint32_t>& GetSsrcs() const;
373 rtc::Optional<uint32_t> GetFirstPrimarySsrc() const;
374
375 void SetLocalSsrc(uint32_t local_ssrc);
376 // TODO(deadbeef): Move these feedback parameters into the recv parameters.
377 void SetFeedbackParameters(bool nack_enabled,
378 bool remb_enabled,
379 bool transport_cc_enabled,
380 webrtc::RtcpMode rtcp_mode);
381 void SetRecvParameters(const ChangedRecvParameters& recv_params);
382
383 void OnFrame(const webrtc::VideoFrame& frame) override;
384 bool IsDefaultStream() const;
385
386 void SetSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
387
388 VideoReceiverInfo GetVideoReceiverInfo(bool log_stats);
389
390 private:
andersc063f0c02017-09-11 11:50:51 -0700391 struct SdpVideoFormatCompare {
392 bool operator()(const webrtc::SdpVideoFormat& lhs,
393 const webrtc::SdpVideoFormat& rhs) const {
394 return std::tie(lhs.name, lhs.parameters) <
395 std::tie(rhs.name, rhs.parameters);
396 }
perkj1f885312017-09-04 02:43:10 -0700397 };
andersc063f0c02017-09-11 11:50:51 -0700398 typedef std::map<webrtc::SdpVideoFormat,
399 std::unique_ptr<webrtc::VideoDecoder>,
400 SdpVideoFormatCompare>
401 DecoderMap;
perkj1f885312017-09-04 02:43:10 -0700402
eladalonf1841382017-06-12 01:16:46 -0700403 void RecreateWebRtcVideoStream();
404 void MaybeRecreateWebRtcFlexfecStream();
405
eladalonc0d481a2017-08-02 07:39:07 -0700406 void MaybeAssociateFlexfecWithVideo();
407 void MaybeDissociateFlexfecFromVideo();
408
perkj1f885312017-09-04 02:43:10 -0700409 void ConfigureCodecs(const std::vector<VideoCodecSettings>& recv_codecs,
andersc063f0c02017-09-11 11:50:51 -0700410 DecoderMap* old_codecs);
eladalonf1841382017-06-12 01:16:46 -0700411 void ConfigureFlexfecCodec(int flexfec_payload_type);
eladalonf1841382017-06-12 01:16:46 -0700412
413 std::string GetCodecNameFromPayloadType(int payload_type);
414
415 webrtc::Call* const call_;
416 StreamParams stream_params_;
417
418 // Both |stream_| and |flexfec_stream_| are managed by |this|. They are
419 // destroyed by calling call_->DestroyVideoReceiveStream and
420 // call_->DestroyFlexfecReceiveStream, respectively.
421 webrtc::VideoReceiveStream* stream_;
422 const bool default_stream_;
423 webrtc::VideoReceiveStream::Config config_;
424 webrtc::FlexfecReceiveStream::Config flexfec_config_;
425 webrtc::FlexfecReceiveStream* flexfec_stream_;
426
Magnus Jedvert07e0d012017-10-31 11:24:54 +0100427 DecoderFactoryAdapter* decoder_factory_;
andersc063f0c02017-09-11 11:50:51 -0700428 DecoderMap allocated_decoders_;
eladalonf1841382017-06-12 01:16:46 -0700429
430 rtc::CriticalSection sink_lock_;
danilchapa37de392017-09-09 04:17:22 -0700431 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink_
432 RTC_GUARDED_BY(sink_lock_);
eladalonf1841382017-06-12 01:16:46 -0700433 // Expands remote RTP timestamps to int64_t to be able to estimate how long
434 // the stream has been running.
435 rtc::TimestampWrapAroundHandler timestamp_wraparound_handler_
danilchapa37de392017-09-09 04:17:22 -0700436 RTC_GUARDED_BY(sink_lock_);
437 int64_t first_frame_timestamp_ RTC_GUARDED_BY(sink_lock_);
eladalonf1841382017-06-12 01:16:46 -0700438 // Start NTP time is estimated as current remote NTP time (estimated from
439 // RTCP) minus the elapsed time, as soon as remote NTP time is available.
danilchapa37de392017-09-09 04:17:22 -0700440 int64_t estimated_remote_start_ntp_time_ms_ RTC_GUARDED_BY(sink_lock_);
eladalonf1841382017-06-12 01:16:46 -0700441 };
442
443 void Construct(webrtc::Call* call, WebRtcVideoEngine* engine);
444
445 bool SendRtp(const uint8_t* data,
446 size_t len,
447 const webrtc::PacketOptions& options) override;
448 bool SendRtcp(const uint8_t* data, size_t len) override;
449
450 static std::vector<VideoCodecSettings> MapCodecs(
451 const std::vector<VideoCodec>& codecs);
452 // Select what video codec will be used for sending, i.e. what codec is used
453 // for local encoding, based on supported remote codecs. The first remote
454 // codec that is supported locally will be selected.
455 rtc::Optional<VideoCodecSettings> SelectSendVideoCodec(
456 const std::vector<VideoCodecSettings>& remote_mapped_codecs) const;
457
458 static bool NonFlexfecReceiveCodecsHaveChanged(
459 std::vector<VideoCodecSettings> before,
460 std::vector<VideoCodecSettings> after);
461
462 void FillSenderStats(VideoMediaInfo* info, bool log_stats);
463 void FillReceiverStats(VideoMediaInfo* info, bool log_stats);
464 void FillBandwidthEstimationStats(const webrtc::Call::Stats& stats,
465 VideoMediaInfo* info);
466 void FillSendAndReceiveCodecStats(VideoMediaInfo* video_media_info);
467
468 rtc::ThreadChecker thread_checker_;
469
470 uint32_t rtcp_receiver_report_ssrc_;
471 bool sending_;
472 webrtc::Call* const call_;
473
474 DefaultUnsignalledSsrcHandler default_unsignalled_ssrc_handler_;
475 UnsignalledSsrcHandler* const unsignalled_ssrc_handler_;
476
477 const MediaConfig::Video video_config_;
478
479 rtc::CriticalSection stream_crit_;
480 // Using primary-ssrc (first ssrc) as key.
481 std::map<uint32_t, WebRtcVideoSendStream*> send_streams_
danilchapa37de392017-09-09 04:17:22 -0700482 RTC_GUARDED_BY(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700483 std::map<uint32_t, WebRtcVideoReceiveStream*> receive_streams_
danilchapa37de392017-09-09 04:17:22 -0700484 RTC_GUARDED_BY(stream_crit_);
485 std::set<uint32_t> send_ssrcs_ RTC_GUARDED_BY(stream_crit_);
486 std::set<uint32_t> receive_ssrcs_ RTC_GUARDED_BY(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700487
488 rtc::Optional<VideoCodecSettings> send_codec_;
489 rtc::Optional<std::vector<webrtc::RtpExtension>> send_rtp_extensions_;
490
Magnus Jedvert07e0d012017-10-31 11:24:54 +0100491 webrtc::VideoEncoderFactory* const encoder_factory_;
492 DecoderFactoryAdapter* const decoder_factory_;
eladalonf1841382017-06-12 01:16:46 -0700493 std::vector<VideoCodecSettings> recv_codecs_;
494 std::vector<webrtc::RtpExtension> recv_rtp_extensions_;
495 // See reason for keeping track of the FlexFEC payload type separately in
496 // comment in WebRtcVideoChannel::ChangedRecvParameters.
497 int recv_flexfec_payload_type_;
Sebastian Janssonfc8d26b2018-02-21 09:52:06 +0100498 webrtc::BitrateConstraints bitrate_config_;
eladalonf1841382017-06-12 01:16:46 -0700499 // TODO(deadbeef): Don't duplicate information between
500 // send_params/recv_params, rtp_extensions, options, etc.
501 VideoSendParameters send_params_;
502 VideoOptions default_send_options_;
503 VideoRecvParameters recv_params_;
504 int64_t last_stats_log_ms_;
Seth Hampson5897a6e2018-04-03 11:16:33 -0700505 // This is a stream param that comes from the remote description, but wasn't
506 // signaled with any a=ssrc lines. It holds information that was signaled
507 // before the unsignaled receive stream is created when the first packet is
508 // received.
509 StreamParams unsignaled_stream_params_;
eladalonf1841382017-06-12 01:16:46 -0700510};
511
ilnik6b826ef2017-06-16 06:53:48 -0700512class EncoderStreamFactory
513 : public webrtc::VideoEncoderConfig::VideoStreamFactoryInterface {
514 public:
515 EncoderStreamFactory(std::string codec_name,
516 int max_qp,
517 int max_framerate,
Seth Hampson1370e302018-02-07 08:50:36 -0800518 bool is_screenshare,
519 bool screenshare_config_explicitly_enabled);
ilnik6b826ef2017-06-16 06:53:48 -0700520
521 private:
522 std::vector<webrtc::VideoStream> CreateEncoderStreams(
523 int width,
524 int height,
525 const webrtc::VideoEncoderConfig& encoder_config) override;
526
527 const std::string codec_name_;
528 const int max_qp_;
529 const int max_framerate_;
Seth Hampson1370e302018-02-07 08:50:36 -0800530 const bool is_screenshare_;
531 // Allows a screenshare specific configuration, which enables temporal
532 // layering and allows simulcast.
533 const bool screenshare_config_explicitly_enabled_;
ilnik6b826ef2017-06-16 06:53:48 -0700534};
535
eladalonf1841382017-06-12 01:16:46 -0700536} // namespace cricket
537
Mirko Bonadei92ea95e2017-09-15 06:47:31 +0200538#endif // MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_