blob: e61f42228dd68817fc2cf8467a2d9d79a092bdab [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
11#ifndef WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_
12#define WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_
13
14#include <map>
15#include <memory>
16#include <set>
17#include <string>
18#include <vector>
19
20#include "webrtc/api/call/transport.h"
kwiberg84f6a3f2017-09-05 08:43:13 -070021#include "webrtc/api/optional.h"
eladalonf1841382017-06-12 01:16:46 -070022#include "webrtc/api/video/video_frame.h"
andersc063f0c02017-09-11 11:50:51 -070023#include "webrtc/api/video_codecs/sdp_video_format.h"
eladalonf1841382017-06-12 01:16:46 -070024#include "webrtc/call/call.h"
25#include "webrtc/call/flexfec_receive_stream.h"
aleloi440b6d92017-08-22 05:43:23 -070026#include "webrtc/call/video_receive_stream.h"
27#include "webrtc/call/video_send_stream.h"
eladalonf1841382017-06-12 01:16:46 -070028#include "webrtc/media/base/mediaengine.h"
29#include "webrtc/media/base/videosinkinterface.h"
30#include "webrtc/media/base/videosourceinterface.h"
31#include "webrtc/media/engine/webrtcvideodecoderfactory.h"
32#include "webrtc/media/engine/webrtcvideoencoderfactory.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020033#include "webrtc/rtc_base/asyncinvoker.h"
34#include "webrtc/rtc_base/criticalsection.h"
35#include "webrtc/rtc_base/networkroute.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020036#include "webrtc/rtc_base/thread_annotations.h"
37#include "webrtc/rtc_base/thread_checker.h"
eladalonf1841382017-06-12 01:16:46 -070038
39namespace webrtc {
40class VideoDecoder;
41class VideoEncoder;
42struct MediaConfig;
43}
44
45namespace rtc {
46class Thread;
47} // namespace rtc
48
49namespace cricket {
50
andersc063f0c02017-09-11 11:50:51 -070051class DecoderFactoryAdapter;
magjeda35df422017-08-30 04:21:30 -070052class EncoderFactoryAdapter;
eladalonf1841382017-06-12 01:16:46 -070053class VideoCapturer;
54class VideoProcessor;
55class VideoRenderer;
56class VoiceMediaChannel;
57class WebRtcDecoderObserver;
58class WebRtcEncoderObserver;
59class WebRtcLocalStreamInfo;
60class WebRtcRenderAdapter;
61class WebRtcVideoChannel;
62class WebRtcVideoChannelRecvInfo;
63class WebRtcVideoChannelSendInfo;
64class WebRtcVoiceEngine;
65class WebRtcVoiceMediaChannel;
66
67struct Device;
68
69class UnsignalledSsrcHandler {
70 public:
71 enum Action {
72 kDropPacket,
73 kDeliverPacket,
74 };
75 virtual Action OnUnsignalledSsrc(WebRtcVideoChannel* channel,
76 uint32_t ssrc) = 0;
77 virtual ~UnsignalledSsrcHandler() = default;
78};
79
80// TODO(pbos): Remove, use external handlers only.
81class DefaultUnsignalledSsrcHandler : public UnsignalledSsrcHandler {
82 public:
83 DefaultUnsignalledSsrcHandler();
84 Action OnUnsignalledSsrc(WebRtcVideoChannel* channel,
85 uint32_t ssrc) override;
86
87 rtc::VideoSinkInterface<webrtc::VideoFrame>* GetDefaultSink() const;
88 void SetDefaultSink(WebRtcVideoChannel* channel,
89 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
90
91 virtual ~DefaultUnsignalledSsrcHandler() = default;
92
93 private:
94 rtc::VideoSinkInterface<webrtc::VideoFrame>* default_sink_;
95};
96
97// WebRtcVideoEngine is used for the new native WebRTC Video API (webrtc:1667).
98class WebRtcVideoEngine {
99 public:
100 WebRtcVideoEngine();
101 virtual ~WebRtcVideoEngine();
102
103 // Basic video engine implementation.
104 void Init();
105
106 WebRtcVideoChannel* CreateChannel(webrtc::Call* call,
107 const MediaConfig& config,
108 const VideoOptions& options);
109
110 std::vector<VideoCodec> codecs() const;
111 RtpCapabilities GetCapabilities() const;
112
113 // Set a WebRtcVideoDecoderFactory for external decoding. Video engine does
114 // not take the ownership of |decoder_factory|. The caller needs to make sure
115 // that |decoder_factory| outlives the video engine.
116 void SetExternalDecoderFactory(WebRtcVideoDecoderFactory* decoder_factory);
117 // Set a WebRtcVideoEncoderFactory for external encoding. Video engine does
118 // not take the ownership of |encoder_factory|. The caller needs to make sure
119 // that |encoder_factory| outlives the video engine.
120 virtual void SetExternalEncoderFactory(
121 WebRtcVideoEncoderFactory* encoder_factory);
122
123 private:
124 bool initialized_;
125
andersc063f0c02017-09-11 11:50:51 -0700126 std::unique_ptr<DecoderFactoryAdapter> decoder_factory_;
magjeda35df422017-08-30 04:21:30 -0700127 std::unique_ptr<EncoderFactoryAdapter> encoder_factory_;
eladalonf1841382017-06-12 01:16:46 -0700128};
129
130class WebRtcVideoChannel : public VideoMediaChannel, public webrtc::Transport {
131 public:
132 WebRtcVideoChannel(webrtc::Call* call,
133 const MediaConfig& config,
134 const VideoOptions& options,
magjeda35df422017-08-30 04:21:30 -0700135 const EncoderFactoryAdapter& encoder_factory,
andersc063f0c02017-09-11 11:50:51 -0700136 const DecoderFactoryAdapter& decoder_factory);
eladalonf1841382017-06-12 01:16:46 -0700137 ~WebRtcVideoChannel() override;
138
139 // VideoMediaChannel implementation
140 rtc::DiffServCodePoint PreferredDscp() const override;
141
142 bool SetSendParameters(const VideoSendParameters& params) override;
143 bool SetRecvParameters(const VideoRecvParameters& params) override;
144 webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override;
145 bool SetRtpSendParameters(uint32_t ssrc,
146 const webrtc::RtpParameters& parameters) override;
147 webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override;
148 bool SetRtpReceiveParameters(
149 uint32_t ssrc,
150 const webrtc::RtpParameters& parameters) override;
151 bool GetSendCodec(VideoCodec* send_codec) override;
152 bool SetSend(bool send) override;
153 bool SetVideoSend(
154 uint32_t ssrc,
155 bool enable,
156 const VideoOptions* options,
157 rtc::VideoSourceInterface<webrtc::VideoFrame>* source) override;
158 bool AddSendStream(const StreamParams& sp) override;
159 bool RemoveSendStream(uint32_t ssrc) override;
160 bool AddRecvStream(const StreamParams& sp) override;
161 bool AddRecvStream(const StreamParams& sp, bool default_stream);
162 bool RemoveRecvStream(uint32_t ssrc) override;
163 bool SetSink(uint32_t ssrc,
164 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
165 void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override;
166 bool GetStats(VideoMediaInfo* info) override;
167
168 void OnPacketReceived(rtc::CopyOnWriteBuffer* packet,
169 const rtc::PacketTime& packet_time) override;
170 void OnRtcpReceived(rtc::CopyOnWriteBuffer* packet,
171 const rtc::PacketTime& packet_time) override;
172 void OnReadyToSend(bool ready) override;
173 void OnNetworkRouteChanged(const std::string& transport_name,
174 const rtc::NetworkRoute& network_route) override;
175 void OnTransportOverheadChanged(int transport_overhead_per_packet) override;
176 void SetInterface(NetworkInterface* iface) override;
177
178 // Implemented for VideoMediaChannelTest.
179 bool sending() const { return sending_; }
180
181 rtc::Optional<uint32_t> GetDefaultReceiveStreamSsrc();
182
183 // AdaptReason is used for expressing why a WebRtcVideoSendStream request
184 // a lower input frame size than the currently configured camera input frame
185 // size. There can be more than one reason OR:ed together.
186 enum AdaptReason {
187 ADAPTREASON_NONE = 0,
188 ADAPTREASON_CPU = 1,
189 ADAPTREASON_BANDWIDTH = 2,
190 };
191
sprang67561a62017-06-15 06:34:42 -0700192 static constexpr int kDefaultQpMax = 56;
193
eladalonf1841382017-06-12 01:16:46 -0700194 private:
195 class WebRtcVideoReceiveStream;
196 struct VideoCodecSettings {
197 VideoCodecSettings();
198
199 // Checks if all members of |*this| are equal to the corresponding members
200 // of |other|.
201 bool operator==(const VideoCodecSettings& other) const;
202 bool operator!=(const VideoCodecSettings& other) const;
203
204 // Checks if all members of |a|, except |flexfec_payload_type|, are equal
205 // to the corresponding members of |b|.
206 static bool EqualsDisregardingFlexfec(const VideoCodecSettings& a,
207 const VideoCodecSettings& b);
208
209 VideoCodec codec;
210 webrtc::UlpfecConfig ulpfec;
211 int flexfec_payload_type;
212 int rtx_payload_type;
213 };
214
215 struct ChangedSendParameters {
216 // These optionals are unset if not changed.
217 rtc::Optional<VideoCodecSettings> codec;
218 rtc::Optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
219 rtc::Optional<int> max_bandwidth_bps;
220 rtc::Optional<bool> conference_mode;
221 rtc::Optional<webrtc::RtcpMode> rtcp_mode;
222 };
223
224 struct ChangedRecvParameters {
225 // These optionals are unset if not changed.
226 rtc::Optional<std::vector<VideoCodecSettings>> codec_settings;
227 rtc::Optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
228 // Keep track of the FlexFEC payload type separately from |codec_settings|.
229 // This allows us to recreate the FlexfecReceiveStream separately from the
230 // VideoReceiveStream when the FlexFEC payload type is changed.
231 rtc::Optional<int> flexfec_payload_type;
232 };
233
234 bool GetChangedSendParameters(const VideoSendParameters& params,
235 ChangedSendParameters* changed_params) const;
236 bool GetChangedRecvParameters(const VideoRecvParameters& params,
237 ChangedRecvParameters* changed_params) const;
238
239 void SetMaxSendBandwidth(int bps);
240
241 void ConfigureReceiverRtp(
242 webrtc::VideoReceiveStream::Config* config,
243 webrtc::FlexfecReceiveStream::Config* flexfec_config,
244 const StreamParams& sp) const;
245 bool ValidateSendSsrcAvailability(const StreamParams& sp) const
danilchapa37de392017-09-09 04:17:22 -0700246 RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700247 bool ValidateReceiveSsrcAvailability(const StreamParams& sp) const
danilchapa37de392017-09-09 04:17:22 -0700248 RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700249 void DeleteReceiveStream(WebRtcVideoReceiveStream* stream)
danilchapa37de392017-09-09 04:17:22 -0700250 RTC_EXCLUSIVE_LOCKS_REQUIRED(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700251
252 static std::string CodecSettingsVectorToString(
253 const std::vector<VideoCodecSettings>& codecs);
254
255 // Wrapper for the sender part.
256 class WebRtcVideoSendStream
257 : public rtc::VideoSourceInterface<webrtc::VideoFrame> {
258 public:
259 WebRtcVideoSendStream(
260 webrtc::Call* call,
261 const StreamParams& sp,
262 webrtc::VideoSendStream::Config config,
263 const VideoOptions& options,
magjeda35df422017-08-30 04:21:30 -0700264 const EncoderFactoryAdapter& encoder_factory,
eladalonf1841382017-06-12 01:16:46 -0700265 bool enable_cpu_overuse_detection,
266 int max_bitrate_bps,
267 const rtc::Optional<VideoCodecSettings>& codec_settings,
268 const rtc::Optional<std::vector<webrtc::RtpExtension>>& rtp_extensions,
269 const VideoSendParameters& send_params);
270 virtual ~WebRtcVideoSendStream();
271
272 void SetSendParameters(const ChangedSendParameters& send_params);
273 bool SetRtpParameters(const webrtc::RtpParameters& parameters);
274 webrtc::RtpParameters GetRtpParameters() const;
275
276 // Implements rtc::VideoSourceInterface<webrtc::VideoFrame>.
277 // WebRtcVideoSendStream acts as a source to the webrtc::VideoSendStream
278 // in |stream_|. This is done to proxy VideoSinkWants from the encoder to
279 // the worker thread.
280 void AddOrUpdateSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink,
281 const rtc::VideoSinkWants& wants) override;
282 void RemoveSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
283
284 bool SetVideoSend(bool mute,
285 const VideoOptions* options,
286 rtc::VideoSourceInterface<webrtc::VideoFrame>* source);
287
288 void SetSend(bool send);
289
290 const std::vector<uint32_t>& GetSsrcs() const;
291 VideoSenderInfo GetVideoSenderInfo(bool log_stats);
292 void FillBitrateInfo(BandwidthEstimationInfo* bwe_info);
293
294 private:
295 // Parameters needed to reconstruct the underlying stream.
296 // webrtc::VideoSendStream doesn't support setting a lot of options on the
297 // fly, so when those need to be changed we tear down and reconstruct with
298 // similar parameters depending on which options changed etc.
299 struct VideoSendStreamParameters {
300 VideoSendStreamParameters(
301 webrtc::VideoSendStream::Config config,
302 const VideoOptions& options,
303 int max_bitrate_bps,
304 const rtc::Optional<VideoCodecSettings>& codec_settings);
305 webrtc::VideoSendStream::Config config;
306 VideoOptions options;
307 int max_bitrate_bps;
308 bool conference_mode;
309 rtc::Optional<VideoCodecSettings> codec_settings;
310 // Sent resolutions + bitrates etc. by the underlying VideoSendStream,
311 // typically changes when setting a new resolution or reconfiguring
312 // bitrates.
313 webrtc::VideoEncoderConfig encoder_config;
314 };
315
eladalonf1841382017-06-12 01:16:46 -0700316 rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
317 ConfigureVideoEncoderSettings(const VideoCodec& codec);
eladalonf1841382017-06-12 01:16:46 -0700318 void SetCodec(const VideoCodecSettings& codec,
319 bool force_encoder_allocation);
320 void RecreateWebRtcStream();
321 webrtc::VideoEncoderConfig CreateVideoEncoderConfig(
322 const VideoCodec& codec) const;
323 void ReconfigureEncoder();
324 bool ValidateRtpParameters(const webrtc::RtpParameters& parameters);
325
326 // Calls Start or Stop according to whether or not |sending_| is true,
327 // and whether or not the encoding in |rtp_parameters_| is active.
328 void UpdateSendState();
329
330 webrtc::VideoSendStream::DegradationPreference GetDegradationPreference()
danilchapa37de392017-09-09 04:17:22 -0700331 const RTC_EXCLUSIVE_LOCKS_REQUIRED(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700332
333 rtc::ThreadChecker thread_checker_;
334 rtc::AsyncInvoker invoker_;
335 rtc::Thread* worker_thread_;
danilchapa37de392017-09-09 04:17:22 -0700336 const std::vector<uint32_t> ssrcs_ RTC_ACCESS_ON(&thread_checker_);
337 const std::vector<SsrcGroup> ssrc_groups_ RTC_ACCESS_ON(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700338 webrtc::Call* const call_;
339 const bool enable_cpu_overuse_detection_;
340 rtc::VideoSourceInterface<webrtc::VideoFrame>* source_
danilchapa37de392017-09-09 04:17:22 -0700341 RTC_ACCESS_ON(&thread_checker_);
magjeda35df422017-08-30 04:21:30 -0700342 std::unique_ptr<EncoderFactoryAdapter> encoder_factory_
danilchapa37de392017-09-09 04:17:22 -0700343 RTC_ACCESS_ON(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700344
danilchapa37de392017-09-09 04:17:22 -0700345 webrtc::VideoSendStream* stream_ RTC_ACCESS_ON(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700346 rtc::VideoSinkInterface<webrtc::VideoFrame>* encoder_sink_
danilchapa37de392017-09-09 04:17:22 -0700347 RTC_ACCESS_ON(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700348 // Contains settings that are the same for all streams in the MediaChannel,
349 // such as codecs, header extensions, and the global bitrate limit for the
350 // entire channel.
danilchapa37de392017-09-09 04:17:22 -0700351 VideoSendStreamParameters parameters_ RTC_ACCESS_ON(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700352 // Contains settings that are unique for each stream, such as max_bitrate.
353 // Does *not* contain codecs, however.
354 // TODO(skvlad): Move ssrcs_ and ssrc_groups_ into rtp_parameters_.
355 // TODO(skvlad): Combine parameters_ and rtp_parameters_ once we have only
356 // one stream per MediaChannel.
danilchapa37de392017-09-09 04:17:22 -0700357 webrtc::RtpParameters rtp_parameters_ RTC_ACCESS_ON(&thread_checker_);
magjeda35df422017-08-30 04:21:30 -0700358 std::unique_ptr<webrtc::VideoEncoder> allocated_encoder_
danilchapa37de392017-09-09 04:17:22 -0700359 RTC_ACCESS_ON(&thread_checker_);
360 VideoCodec allocated_codec_ RTC_ACCESS_ON(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700361
danilchapa37de392017-09-09 04:17:22 -0700362 bool sending_ RTC_ACCESS_ON(&thread_checker_);
eladalonf1841382017-06-12 01:16:46 -0700363 };
364
365 // Wrapper for the receiver part, contains configs etc. that are needed to
366 // reconstruct the underlying VideoReceiveStream.
367 class WebRtcVideoReceiveStream
368 : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
369 public:
370 WebRtcVideoReceiveStream(
371 webrtc::Call* call,
372 const StreamParams& sp,
373 webrtc::VideoReceiveStream::Config config,
andersc063f0c02017-09-11 11:50:51 -0700374 const DecoderFactoryAdapter& decoder_factory,
eladalonf1841382017-06-12 01:16:46 -0700375 bool default_stream,
376 const std::vector<VideoCodecSettings>& recv_codecs,
377 const webrtc::FlexfecReceiveStream::Config& flexfec_config);
378 ~WebRtcVideoReceiveStream();
379
380 const std::vector<uint32_t>& GetSsrcs() const;
381 rtc::Optional<uint32_t> GetFirstPrimarySsrc() const;
382
383 void SetLocalSsrc(uint32_t local_ssrc);
384 // TODO(deadbeef): Move these feedback parameters into the recv parameters.
385 void SetFeedbackParameters(bool nack_enabled,
386 bool remb_enabled,
387 bool transport_cc_enabled,
388 webrtc::RtcpMode rtcp_mode);
389 void SetRecvParameters(const ChangedRecvParameters& recv_params);
390
391 void OnFrame(const webrtc::VideoFrame& frame) override;
392 bool IsDefaultStream() const;
393
394 void SetSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
395
396 VideoReceiverInfo GetVideoReceiverInfo(bool log_stats);
397
398 private:
andersc063f0c02017-09-11 11:50:51 -0700399 struct SdpVideoFormatCompare {
400 bool operator()(const webrtc::SdpVideoFormat& lhs,
401 const webrtc::SdpVideoFormat& rhs) const {
402 return std::tie(lhs.name, lhs.parameters) <
403 std::tie(rhs.name, rhs.parameters);
404 }
perkj1f885312017-09-04 02:43:10 -0700405 };
andersc063f0c02017-09-11 11:50:51 -0700406 typedef std::map<webrtc::SdpVideoFormat,
407 std::unique_ptr<webrtc::VideoDecoder>,
408 SdpVideoFormatCompare>
409 DecoderMap;
perkj1f885312017-09-04 02:43:10 -0700410
eladalonf1841382017-06-12 01:16:46 -0700411 void RecreateWebRtcVideoStream();
412 void MaybeRecreateWebRtcFlexfecStream();
413
eladalonc0d481a2017-08-02 07:39:07 -0700414 void MaybeAssociateFlexfecWithVideo();
415 void MaybeDissociateFlexfecFromVideo();
416
perkj1f885312017-09-04 02:43:10 -0700417 void ConfigureCodecs(const std::vector<VideoCodecSettings>& recv_codecs,
andersc063f0c02017-09-11 11:50:51 -0700418 DecoderMap* old_codecs);
eladalonf1841382017-06-12 01:16:46 -0700419 void ConfigureFlexfecCodec(int flexfec_payload_type);
eladalonf1841382017-06-12 01:16:46 -0700420
421 std::string GetCodecNameFromPayloadType(int payload_type);
422
423 webrtc::Call* const call_;
424 StreamParams stream_params_;
425
426 // Both |stream_| and |flexfec_stream_| are managed by |this|. They are
427 // destroyed by calling call_->DestroyVideoReceiveStream and
428 // call_->DestroyFlexfecReceiveStream, respectively.
429 webrtc::VideoReceiveStream* stream_;
430 const bool default_stream_;
431 webrtc::VideoReceiveStream::Config config_;
432 webrtc::FlexfecReceiveStream::Config flexfec_config_;
433 webrtc::FlexfecReceiveStream* flexfec_stream_;
434
andersc063f0c02017-09-11 11:50:51 -0700435 std::unique_ptr<DecoderFactoryAdapter> decoder_factory_;
436 DecoderMap allocated_decoders_;
eladalonf1841382017-06-12 01:16:46 -0700437
438 rtc::CriticalSection sink_lock_;
danilchapa37de392017-09-09 04:17:22 -0700439 rtc::VideoSinkInterface<webrtc::VideoFrame>* sink_
440 RTC_GUARDED_BY(sink_lock_);
eladalonf1841382017-06-12 01:16:46 -0700441 // Expands remote RTP timestamps to int64_t to be able to estimate how long
442 // the stream has been running.
443 rtc::TimestampWrapAroundHandler timestamp_wraparound_handler_
danilchapa37de392017-09-09 04:17:22 -0700444 RTC_GUARDED_BY(sink_lock_);
445 int64_t first_frame_timestamp_ RTC_GUARDED_BY(sink_lock_);
eladalonf1841382017-06-12 01:16:46 -0700446 // Start NTP time is estimated as current remote NTP time (estimated from
447 // RTCP) minus the elapsed time, as soon as remote NTP time is available.
danilchapa37de392017-09-09 04:17:22 -0700448 int64_t estimated_remote_start_ntp_time_ms_ RTC_GUARDED_BY(sink_lock_);
eladalonf1841382017-06-12 01:16:46 -0700449 };
450
451 void Construct(webrtc::Call* call, WebRtcVideoEngine* engine);
452
453 bool SendRtp(const uint8_t* data,
454 size_t len,
455 const webrtc::PacketOptions& options) override;
456 bool SendRtcp(const uint8_t* data, size_t len) override;
457
458 static std::vector<VideoCodecSettings> MapCodecs(
459 const std::vector<VideoCodec>& codecs);
460 // Select what video codec will be used for sending, i.e. what codec is used
461 // for local encoding, based on supported remote codecs. The first remote
462 // codec that is supported locally will be selected.
463 rtc::Optional<VideoCodecSettings> SelectSendVideoCodec(
464 const std::vector<VideoCodecSettings>& remote_mapped_codecs) const;
465
466 static bool NonFlexfecReceiveCodecsHaveChanged(
467 std::vector<VideoCodecSettings> before,
468 std::vector<VideoCodecSettings> after);
469
470 void FillSenderStats(VideoMediaInfo* info, bool log_stats);
471 void FillReceiverStats(VideoMediaInfo* info, bool log_stats);
472 void FillBandwidthEstimationStats(const webrtc::Call::Stats& stats,
473 VideoMediaInfo* info);
474 void FillSendAndReceiveCodecStats(VideoMediaInfo* video_media_info);
475
476 rtc::ThreadChecker thread_checker_;
477
478 uint32_t rtcp_receiver_report_ssrc_;
479 bool sending_;
480 webrtc::Call* const call_;
481
482 DefaultUnsignalledSsrcHandler default_unsignalled_ssrc_handler_;
483 UnsignalledSsrcHandler* const unsignalled_ssrc_handler_;
484
485 const MediaConfig::Video video_config_;
486
487 rtc::CriticalSection stream_crit_;
488 // Using primary-ssrc (first ssrc) as key.
489 std::map<uint32_t, WebRtcVideoSendStream*> send_streams_
danilchapa37de392017-09-09 04:17:22 -0700490 RTC_GUARDED_BY(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700491 std::map<uint32_t, WebRtcVideoReceiveStream*> receive_streams_
danilchapa37de392017-09-09 04:17:22 -0700492 RTC_GUARDED_BY(stream_crit_);
493 std::set<uint32_t> send_ssrcs_ RTC_GUARDED_BY(stream_crit_);
494 std::set<uint32_t> receive_ssrcs_ RTC_GUARDED_BY(stream_crit_);
eladalonf1841382017-06-12 01:16:46 -0700495
496 rtc::Optional<VideoCodecSettings> send_codec_;
497 rtc::Optional<std::vector<webrtc::RtpExtension>> send_rtp_extensions_;
498
magjeda35df422017-08-30 04:21:30 -0700499 std::unique_ptr<EncoderFactoryAdapter> encoder_factory_;
andersc063f0c02017-09-11 11:50:51 -0700500 std::unique_ptr<DecoderFactoryAdapter> decoder_factory_;
eladalonf1841382017-06-12 01:16:46 -0700501 std::vector<VideoCodecSettings> recv_codecs_;
502 std::vector<webrtc::RtpExtension> recv_rtp_extensions_;
503 // See reason for keeping track of the FlexFEC payload type separately in
504 // comment in WebRtcVideoChannel::ChangedRecvParameters.
505 int recv_flexfec_payload_type_;
506 webrtc::Call::Config::BitrateConfig bitrate_config_;
507 // TODO(deadbeef): Don't duplicate information between
508 // send_params/recv_params, rtp_extensions, options, etc.
509 VideoSendParameters send_params_;
510 VideoOptions default_send_options_;
511 VideoRecvParameters recv_params_;
512 int64_t last_stats_log_ms_;
513};
514
ilnik6b826ef2017-06-16 06:53:48 -0700515class EncoderStreamFactory
516 : public webrtc::VideoEncoderConfig::VideoStreamFactoryInterface {
517 public:
518 EncoderStreamFactory(std::string codec_name,
519 int max_qp,
520 int max_framerate,
521 bool is_screencast,
522 bool conference_mode);
523
524 private:
525 std::vector<webrtc::VideoStream> CreateEncoderStreams(
526 int width,
527 int height,
528 const webrtc::VideoEncoderConfig& encoder_config) override;
529
530 const std::string codec_name_;
531 const int max_qp_;
532 const int max_framerate_;
533 const bool is_screencast_;
534 const bool conference_mode_;
535};
536
eladalonf1841382017-06-12 01:16:46 -0700537} // namespace cricket
538
539#endif // WEBRTC_MEDIA_ENGINE_WEBRTCVIDEOENGINE_H_