123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681 |
- /*
- * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
- #ifndef MEDIA_ENGINE_WEBRTC_VIDEO_ENGINE_H_
- #define MEDIA_ENGINE_WEBRTC_VIDEO_ENGINE_H_
- #include <map>
- #include <memory>
- #include <set>
- #include <string>
- #include <vector>
- #include "absl/types/optional.h"
- #include "api/call/transport.h"
- #include "api/transport/field_trial_based_config.h"
- #include "api/video/video_bitrate_allocator_factory.h"
- #include "api/video/video_frame.h"
- #include "api/video/video_sink_interface.h"
- #include "api/video/video_source_interface.h"
- #include "api/video_codecs/sdp_video_format.h"
- #include "call/call.h"
- #include "call/flexfec_receive_stream.h"
- #include "call/video_receive_stream.h"
- #include "call/video_send_stream.h"
- #include "media/base/media_engine.h"
- #include "media/engine/constants.h"
- #include "media/engine/unhandled_packets_buffer.h"
- #include "rtc_base/network_route.h"
- #include "rtc_base/synchronization/mutex.h"
- #include "rtc_base/thread_annotations.h"
- #include "rtc_base/thread_checker.h"
- namespace webrtc {
- class VideoDecoderFactory;
- class VideoEncoderFactory;
- struct MediaConfig;
- } // namespace webrtc
- namespace rtc {
- class Thread;
- } // namespace rtc
- namespace cricket {
- class WebRtcVideoChannel;
- // Public for testing.
- // Inputs StreamStats for all types of substreams (kMedia, kRtx, kFlexfec) and
- // merges any non-kMedia substream stats object into its referenced kMedia-type
- // substream. The resulting substreams are all kMedia. This means, for example,
- // that packet and byte counters of RTX and FlexFEC streams are accounted for in
- // the relevant RTP media stream's stats. This makes the resulting StreamStats
- // objects ready to be turned into "outbound-rtp" stats objects for GetStats()
- // which does not create separate stream stats objects for complementary
- // streams.
- std::map<uint32_t, webrtc::VideoSendStream::StreamStats>
- MergeInfoAboutOutboundRtpSubstreamsForTesting(
- const std::map<uint32_t, webrtc::VideoSendStream::StreamStats>& substreams);
- class UnsignalledSsrcHandler {
- public:
- enum Action {
- kDropPacket,
- kDeliverPacket,
- };
- virtual Action OnUnsignalledSsrc(WebRtcVideoChannel* channel,
- uint32_t ssrc) = 0;
- virtual ~UnsignalledSsrcHandler() = default;
- };
- // TODO(pbos): Remove, use external handlers only.
- class DefaultUnsignalledSsrcHandler : public UnsignalledSsrcHandler {
- public:
- DefaultUnsignalledSsrcHandler();
- Action OnUnsignalledSsrc(WebRtcVideoChannel* channel, uint32_t ssrc) override;
- rtc::VideoSinkInterface<webrtc::VideoFrame>* GetDefaultSink() const;
- void SetDefaultSink(WebRtcVideoChannel* channel,
- rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
- virtual ~DefaultUnsignalledSsrcHandler() = default;
- private:
- rtc::VideoSinkInterface<webrtc::VideoFrame>* default_sink_;
- };
- // WebRtcVideoEngine is used for the new native WebRTC Video API (webrtc:1667).
- class WebRtcVideoEngine : public VideoEngineInterface {
- public:
- // These video codec factories represents all video codecs, i.e. both software
- // and external hardware codecs.
- WebRtcVideoEngine(
- std::unique_ptr<webrtc::VideoEncoderFactory> video_encoder_factory,
- std::unique_ptr<webrtc::VideoDecoderFactory> video_decoder_factory,
- const webrtc::WebRtcKeyValueConfig& trials);
- ~WebRtcVideoEngine() override;
- VideoMediaChannel* CreateMediaChannel(
- webrtc::Call* call,
- const MediaConfig& config,
- const VideoOptions& options,
- const webrtc::CryptoOptions& crypto_options,
- webrtc::VideoBitrateAllocatorFactory* video_bitrate_allocator_factory)
- override;
- std::vector<VideoCodec> send_codecs() const override;
- std::vector<VideoCodec> recv_codecs() const override;
- std::vector<webrtc::RtpHeaderExtensionCapability> GetRtpHeaderExtensions()
- const override;
- private:
- const std::unique_ptr<webrtc::VideoDecoderFactory> decoder_factory_;
- const std::unique_ptr<webrtc::VideoEncoderFactory> encoder_factory_;
- const std::unique_ptr<webrtc::VideoBitrateAllocatorFactory>
- bitrate_allocator_factory_;
- const webrtc::WebRtcKeyValueConfig& trials_;
- };
- class WebRtcVideoChannel : public VideoMediaChannel,
- public webrtc::Transport,
- public webrtc::EncoderSwitchRequestCallback {
- public:
- WebRtcVideoChannel(
- webrtc::Call* call,
- const MediaConfig& config,
- const VideoOptions& options,
- const webrtc::CryptoOptions& crypto_options,
- webrtc::VideoEncoderFactory* encoder_factory,
- webrtc::VideoDecoderFactory* decoder_factory,
- webrtc::VideoBitrateAllocatorFactory* bitrate_allocator_factory);
- ~WebRtcVideoChannel() override;
- // VideoMediaChannel implementation
- bool SetSendParameters(const VideoSendParameters& params) override;
- bool SetRecvParameters(const VideoRecvParameters& params) override;
- webrtc::RtpParameters GetRtpSendParameters(uint32_t ssrc) const override;
- webrtc::RTCError SetRtpSendParameters(
- uint32_t ssrc,
- const webrtc::RtpParameters& parameters) override;
- webrtc::RtpParameters GetRtpReceiveParameters(uint32_t ssrc) const override;
- webrtc::RtpParameters GetDefaultRtpReceiveParameters() const override;
- bool GetSendCodec(VideoCodec* send_codec) override;
- bool SetSend(bool send) override;
- bool SetVideoSend(
- uint32_t ssrc,
- const VideoOptions* options,
- rtc::VideoSourceInterface<webrtc::VideoFrame>* source) override;
- bool AddSendStream(const StreamParams& sp) override;
- bool RemoveSendStream(uint32_t ssrc) override;
- bool AddRecvStream(const StreamParams& sp) override;
- bool AddRecvStream(const StreamParams& sp, bool default_stream);
- bool RemoveRecvStream(uint32_t ssrc) override;
- void ResetUnsignaledRecvStream() override;
- bool SetSink(uint32_t ssrc,
- rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
- void SetDefaultSink(
- rtc::VideoSinkInterface<webrtc::VideoFrame>* sink) override;
- void FillBitrateInfo(BandwidthEstimationInfo* bwe_info) override;
- bool GetStats(VideoMediaInfo* info) override;
- void OnPacketReceived(rtc::CopyOnWriteBuffer packet,
- int64_t packet_time_us) override;
- void OnReadyToSend(bool ready) override;
- void OnNetworkRouteChanged(const std::string& transport_name,
- const rtc::NetworkRoute& network_route) override;
- void SetInterface(NetworkInterface* iface) override;
- // E2E Encrypted Video Frame API
- // Set a frame decryptor to a particular ssrc that will intercept all
- // incoming video frames and attempt to decrypt them before forwarding the
- // result.
- void SetFrameDecryptor(uint32_t ssrc,
- rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
- frame_decryptor) override;
- // Set a frame encryptor to a particular ssrc that will intercept all
- // outgoing video frames and attempt to encrypt them and forward the result
- // to the packetizer.
- void SetFrameEncryptor(uint32_t ssrc,
- rtc::scoped_refptr<webrtc::FrameEncryptorInterface>
- frame_encryptor) override;
- void SetVideoCodecSwitchingEnabled(bool enabled) override;
- bool SetBaseMinimumPlayoutDelayMs(uint32_t ssrc, int delay_ms) override;
- absl::optional<int> GetBaseMinimumPlayoutDelayMs(
- uint32_t ssrc) const override;
- // Implemented for VideoMediaChannelTest.
- bool sending() const {
- RTC_DCHECK_RUN_ON(&thread_checker_);
- return sending_;
- }
- absl::optional<uint32_t> GetDefaultReceiveStreamSsrc();
- StreamParams unsignaled_stream_params() {
- RTC_DCHECK_RUN_ON(&thread_checker_);
- return unsignaled_stream_params_;
- }
- // AdaptReason is used for expressing why a WebRtcVideoSendStream request
- // a lower input frame size than the currently configured camera input frame
- // size. There can be more than one reason OR:ed together.
- enum AdaptReason {
- ADAPTREASON_NONE = 0,
- ADAPTREASON_CPU = 1,
- ADAPTREASON_BANDWIDTH = 2,
- };
- static constexpr int kDefaultQpMax = 56;
- std::vector<webrtc::RtpSource> GetSources(uint32_t ssrc) const override;
- // Take the buffered packets for |ssrcs| and feed them into DeliverPacket.
- // This method does nothing unless unknown_ssrc_packet_buffer_ is configured.
- void BackfillBufferedPackets(rtc::ArrayView<const uint32_t> ssrcs);
- // Implements webrtc::EncoderSwitchRequestCallback.
- void RequestEncoderFallback() override;
- // TODO(bugs.webrtc.org/11341) : Remove this version of RequestEncoderSwitch.
- void RequestEncoderSwitch(
- const EncoderSwitchRequestCallback::Config& conf) override;
- void RequestEncoderSwitch(const webrtc::SdpVideoFormat& format) override;
- void SetRecordableEncodedFrameCallback(
- uint32_t ssrc,
- std::function<void(const webrtc::RecordableEncodedFrame&)> callback)
- override;
- void ClearRecordableEncodedFrameCallback(uint32_t ssrc) override;
- void GenerateKeyFrame(uint32_t ssrc) override;
- void SetEncoderToPacketizerFrameTransformer(
- uint32_t ssrc,
- rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
- override;
- void SetDepacketizerToDecoderFrameTransformer(
- uint32_t ssrc,
- rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer)
- override;
- private:
- class WebRtcVideoReceiveStream;
- // Finds VideoReceiveStream corresponding to ssrc. Aware of unsignalled ssrc
- // handling.
- WebRtcVideoReceiveStream* FindReceiveStream(uint32_t ssrc)
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- struct VideoCodecSettings {
- VideoCodecSettings();
- // Checks if all members of |*this| are equal to the corresponding members
- // of |other|.
- bool operator==(const VideoCodecSettings& other) const;
- bool operator!=(const VideoCodecSettings& other) const;
- // Checks if all members of |a|, except |flexfec_payload_type|, are equal
- // to the corresponding members of |b|.
- static bool EqualsDisregardingFlexfec(const VideoCodecSettings& a,
- const VideoCodecSettings& b);
- VideoCodec codec;
- webrtc::UlpfecConfig ulpfec;
- int flexfec_payload_type; // -1 if absent.
- int rtx_payload_type; // -1 if absent.
- };
- struct ChangedSendParameters {
- // These optionals are unset if not changed.
- absl::optional<VideoCodecSettings> send_codec;
- absl::optional<std::vector<VideoCodecSettings>> negotiated_codecs;
- absl::optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
- absl::optional<std::string> mid;
- absl::optional<bool> extmap_allow_mixed;
- absl::optional<int> max_bandwidth_bps;
- absl::optional<bool> conference_mode;
- absl::optional<webrtc::RtcpMode> rtcp_mode;
- };
- struct ChangedRecvParameters {
- // These optionals are unset if not changed.
- absl::optional<std::vector<VideoCodecSettings>> codec_settings;
- absl::optional<std::vector<webrtc::RtpExtension>> rtp_header_extensions;
- // Keep track of the FlexFEC payload type separately from |codec_settings|.
- // This allows us to recreate the FlexfecReceiveStream separately from the
- // VideoReceiveStream when the FlexFEC payload type is changed.
- absl::optional<int> flexfec_payload_type;
- };
- bool GetChangedSendParameters(const VideoSendParameters& params,
- ChangedSendParameters* changed_params) const
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- bool ApplyChangedParams(const ChangedSendParameters& changed_params);
- bool GetChangedRecvParameters(const VideoRecvParameters& params,
- ChangedRecvParameters* changed_params) const
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- void ConfigureReceiverRtp(
- webrtc::VideoReceiveStream::Config* config,
- webrtc::FlexfecReceiveStream::Config* flexfec_config,
- const StreamParams& sp) const
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- bool ValidateSendSsrcAvailability(const StreamParams& sp) const
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- bool ValidateReceiveSsrcAvailability(const StreamParams& sp) const
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- void DeleteReceiveStream(WebRtcVideoReceiveStream* stream)
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- static std::string CodecSettingsVectorToString(
- const std::vector<VideoCodecSettings>& codecs);
- // Wrapper for the sender part.
- class WebRtcVideoSendStream {
- public:
- WebRtcVideoSendStream(
- webrtc::Call* call,
- const StreamParams& sp,
- webrtc::VideoSendStream::Config config,
- const VideoOptions& options,
- bool enable_cpu_overuse_detection,
- int max_bitrate_bps,
- const absl::optional<VideoCodecSettings>& codec_settings,
- const absl::optional<std::vector<webrtc::RtpExtension>>& rtp_extensions,
- const VideoSendParameters& send_params);
- ~WebRtcVideoSendStream();
- void SetSendParameters(const ChangedSendParameters& send_params);
- webrtc::RTCError SetRtpParameters(const webrtc::RtpParameters& parameters);
- webrtc::RtpParameters GetRtpParameters() const;
- void SetFrameEncryptor(
- rtc::scoped_refptr<webrtc::FrameEncryptorInterface> frame_encryptor);
- bool SetVideoSend(const VideoOptions* options,
- rtc::VideoSourceInterface<webrtc::VideoFrame>* source);
- void SetSend(bool send);
- const std::vector<uint32_t>& GetSsrcs() const;
- // Returns per ssrc VideoSenderInfos. Useful for simulcast scenario.
- std::vector<VideoSenderInfo> GetPerLayerVideoSenderInfos(bool log_stats);
- // Aggregates per ssrc VideoSenderInfos to single VideoSenderInfo for
- // legacy reasons. Used in old GetStats API and track stats.
- VideoSenderInfo GetAggregatedVideoSenderInfo(
- const std::vector<VideoSenderInfo>& infos) const;
- void FillBitrateInfo(BandwidthEstimationInfo* bwe_info);
- void SetEncoderToPacketizerFrameTransformer(
- rtc::scoped_refptr<webrtc::FrameTransformerInterface>
- frame_transformer);
- private:
- // Parameters needed to reconstruct the underlying stream.
- // webrtc::VideoSendStream doesn't support setting a lot of options on the
- // fly, so when those need to be changed we tear down and reconstruct with
- // similar parameters depending on which options changed etc.
- struct VideoSendStreamParameters {
- VideoSendStreamParameters(
- webrtc::VideoSendStream::Config config,
- const VideoOptions& options,
- int max_bitrate_bps,
- const absl::optional<VideoCodecSettings>& codec_settings);
- webrtc::VideoSendStream::Config config;
- VideoOptions options;
- int max_bitrate_bps;
- bool conference_mode;
- absl::optional<VideoCodecSettings> codec_settings;
- // Sent resolutions + bitrates etc. by the underlying VideoSendStream,
- // typically changes when setting a new resolution or reconfiguring
- // bitrates.
- webrtc::VideoEncoderConfig encoder_config;
- };
- rtc::scoped_refptr<webrtc::VideoEncoderConfig::EncoderSpecificSettings>
- ConfigureVideoEncoderSettings(const VideoCodec& codec);
- void SetCodec(const VideoCodecSettings& codec);
- void RecreateWebRtcStream();
- webrtc::VideoEncoderConfig CreateVideoEncoderConfig(
- const VideoCodec& codec) const;
- void ReconfigureEncoder();
- // Calls Start or Stop according to whether or not |sending_| is true,
- // and whether or not the encoding in |rtp_parameters_| is active.
- void UpdateSendState();
- webrtc::DegradationPreference GetDegradationPreference() const
- RTC_EXCLUSIVE_LOCKS_REQUIRED(&thread_checker_);
- rtc::ThreadChecker thread_checker_;
- rtc::Thread* worker_thread_;
- const std::vector<uint32_t> ssrcs_ RTC_GUARDED_BY(&thread_checker_);
- const std::vector<SsrcGroup> ssrc_groups_ RTC_GUARDED_BY(&thread_checker_);
- webrtc::Call* const call_;
- const bool enable_cpu_overuse_detection_;
- rtc::VideoSourceInterface<webrtc::VideoFrame>* source_
- RTC_GUARDED_BY(&thread_checker_);
- webrtc::VideoSendStream* stream_ RTC_GUARDED_BY(&thread_checker_);
- // Contains settings that are the same for all streams in the MediaChannel,
- // such as codecs, header extensions, and the global bitrate limit for the
- // entire channel.
- VideoSendStreamParameters parameters_ RTC_GUARDED_BY(&thread_checker_);
- // Contains settings that are unique for each stream, such as max_bitrate.
- // Does *not* contain codecs, however.
- // TODO(skvlad): Move ssrcs_ and ssrc_groups_ into rtp_parameters_.
- // TODO(skvlad): Combine parameters_ and rtp_parameters_ once we have only
- // one stream per MediaChannel.
- webrtc::RtpParameters rtp_parameters_ RTC_GUARDED_BY(&thread_checker_);
- bool sending_ RTC_GUARDED_BY(&thread_checker_);
- // TODO(asapersson): investigate why setting
- // DegrationPreferences::MAINTAIN_RESOLUTION isn't sufficient to disable
- // downscaling everywhere in the pipeline.
- const bool disable_automatic_resize_;
- };
- // Wrapper for the receiver part, contains configs etc. that are needed to
- // reconstruct the underlying VideoReceiveStream.
- class WebRtcVideoReceiveStream
- : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
- public:
- WebRtcVideoReceiveStream(
- WebRtcVideoChannel* channel,
- webrtc::Call* call,
- const StreamParams& sp,
- webrtc::VideoReceiveStream::Config config,
- webrtc::VideoDecoderFactory* decoder_factory,
- bool default_stream,
- const std::vector<VideoCodecSettings>& recv_codecs,
- const webrtc::FlexfecReceiveStream::Config& flexfec_config);
- ~WebRtcVideoReceiveStream();
- const std::vector<uint32_t>& GetSsrcs() const;
- std::vector<webrtc::RtpSource> GetSources();
- // Does not return codecs, they are filled by the owning WebRtcVideoChannel.
- webrtc::RtpParameters GetRtpParameters() const;
- void SetLocalSsrc(uint32_t local_ssrc);
- // TODO(deadbeef): Move these feedback parameters into the recv parameters.
- void SetFeedbackParameters(bool lntf_enabled,
- bool nack_enabled,
- bool transport_cc_enabled,
- webrtc::RtcpMode rtcp_mode);
- void SetRecvParameters(const ChangedRecvParameters& recv_params);
- void OnFrame(const webrtc::VideoFrame& frame) override;
- bool IsDefaultStream() const;
- void SetFrameDecryptor(
- rtc::scoped_refptr<webrtc::FrameDecryptorInterface> frame_decryptor);
- bool SetBaseMinimumPlayoutDelayMs(int delay_ms);
- int GetBaseMinimumPlayoutDelayMs() const;
- void SetSink(rtc::VideoSinkInterface<webrtc::VideoFrame>* sink);
- VideoReceiverInfo GetVideoReceiverInfo(bool log_stats);
- void SetRecordableEncodedFrameCallback(
- std::function<void(const webrtc::RecordableEncodedFrame&)> callback);
- void ClearRecordableEncodedFrameCallback();
- void GenerateKeyFrame();
- void SetDepacketizerToDecoderFrameTransformer(
- rtc::scoped_refptr<webrtc::FrameTransformerInterface>
- frame_transformer);
- private:
- void RecreateWebRtcVideoStream();
- void MaybeRecreateWebRtcFlexfecStream();
- void MaybeAssociateFlexfecWithVideo();
- void MaybeDissociateFlexfecFromVideo();
- void ConfigureCodecs(const std::vector<VideoCodecSettings>& recv_codecs);
- void ConfigureFlexfecCodec(int flexfec_payload_type);
- std::string GetCodecNameFromPayloadType(int payload_type);
- WebRtcVideoChannel* const channel_;
- webrtc::Call* const call_;
- const StreamParams stream_params_;
- // Both |stream_| and |flexfec_stream_| are managed by |this|. They are
- // destroyed by calling call_->DestroyVideoReceiveStream and
- // call_->DestroyFlexfecReceiveStream, respectively.
- webrtc::VideoReceiveStream* stream_;
- const bool default_stream_;
- webrtc::VideoReceiveStream::Config config_;
- webrtc::FlexfecReceiveStream::Config flexfec_config_;
- webrtc::FlexfecReceiveStream* flexfec_stream_;
- webrtc::VideoDecoderFactory* const decoder_factory_;
- webrtc::Mutex sink_lock_;
- rtc::VideoSinkInterface<webrtc::VideoFrame>* sink_
- RTC_GUARDED_BY(sink_lock_);
- // Expands remote RTP timestamps to int64_t to be able to estimate how long
- // the stream has been running.
- rtc::TimestampWrapAroundHandler timestamp_wraparound_handler_
- RTC_GUARDED_BY(sink_lock_);
- int64_t first_frame_timestamp_ RTC_GUARDED_BY(sink_lock_);
- // Start NTP time is estimated as current remote NTP time (estimated from
- // RTCP) minus the elapsed time, as soon as remote NTP time is available.
- int64_t estimated_remote_start_ntp_time_ms_ RTC_GUARDED_BY(sink_lock_);
- };
- void Construct(webrtc::Call* call, WebRtcVideoEngine* engine);
- bool SendRtp(const uint8_t* data,
- size_t len,
- const webrtc::PacketOptions& options) override;
- bool SendRtcp(const uint8_t* data, size_t len) override;
- // Generate the list of codec parameters to pass down based on the negotiated
- // "codecs". Note that VideoCodecSettings correspond to concrete codecs like
- // VP8, VP9, H264 while VideoCodecs correspond also to "virtual" codecs like
- // RTX, ULPFEC, FLEXFEC.
- static std::vector<VideoCodecSettings> MapCodecs(
- const std::vector<VideoCodec>& codecs);
- // Get all codecs that are compatible with the receiver.
- std::vector<VideoCodecSettings> SelectSendVideoCodecs(
- const std::vector<VideoCodecSettings>& remote_mapped_codecs) const
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- static bool NonFlexfecReceiveCodecsHaveChanged(
- std::vector<VideoCodecSettings> before,
- std::vector<VideoCodecSettings> after);
- void FillSenderStats(VideoMediaInfo* info, bool log_stats)
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- void FillReceiverStats(VideoMediaInfo* info, bool log_stats)
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- void FillBandwidthEstimationStats(const webrtc::Call::Stats& stats,
- VideoMediaInfo* info)
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- void FillSendAndReceiveCodecStats(VideoMediaInfo* video_media_info)
- RTC_EXCLUSIVE_LOCKS_REQUIRED(thread_checker_);
- rtc::Thread* const worker_thread_;
- rtc::ThreadChecker thread_checker_;
- uint32_t rtcp_receiver_report_ssrc_ RTC_GUARDED_BY(thread_checker_);
- bool sending_ RTC_GUARDED_BY(thread_checker_);
- webrtc::Call* const call_ RTC_GUARDED_BY(thread_checker_);
- DefaultUnsignalledSsrcHandler default_unsignalled_ssrc_handler_
- RTC_GUARDED_BY(thread_checker_);
- UnsignalledSsrcHandler* const unsignalled_ssrc_handler_
- RTC_GUARDED_BY(thread_checker_);
- // Delay for unsignaled streams, which may be set before the stream exists.
- int default_recv_base_minimum_delay_ms_ RTC_GUARDED_BY(thread_checker_) = 0;
- const MediaConfig::Video video_config_ RTC_GUARDED_BY(thread_checker_);
- // Using primary-ssrc (first ssrc) as key.
- std::map<uint32_t, WebRtcVideoSendStream*> send_streams_
- RTC_GUARDED_BY(thread_checker_);
- std::map<uint32_t, WebRtcVideoReceiveStream*> receive_streams_
- RTC_GUARDED_BY(thread_checker_);
- std::set<uint32_t> send_ssrcs_ RTC_GUARDED_BY(thread_checker_);
- std::set<uint32_t> receive_ssrcs_ RTC_GUARDED_BY(thread_checker_);
- absl::optional<VideoCodecSettings> send_codec_
- RTC_GUARDED_BY(thread_checker_);
- std::vector<VideoCodecSettings> negotiated_codecs_
- RTC_GUARDED_BY(thread_checker_);
- absl::optional<std::vector<webrtc::RtpExtension>> send_rtp_extensions_
- RTC_GUARDED_BY(thread_checker_);
- webrtc::VideoEncoderFactory* const encoder_factory_
- RTC_GUARDED_BY(thread_checker_);
- webrtc::VideoDecoderFactory* const decoder_factory_
- RTC_GUARDED_BY(thread_checker_);
- webrtc::VideoBitrateAllocatorFactory* const bitrate_allocator_factory_
- RTC_GUARDED_BY(thread_checker_);
- std::vector<VideoCodecSettings> recv_codecs_ RTC_GUARDED_BY(thread_checker_);
- std::vector<webrtc::RtpExtension> recv_rtp_extensions_
- RTC_GUARDED_BY(thread_checker_);
- // See reason for keeping track of the FlexFEC payload type separately in
- // comment in WebRtcVideoChannel::ChangedRecvParameters.
- int recv_flexfec_payload_type_ RTC_GUARDED_BY(thread_checker_);
- webrtc::BitrateConstraints bitrate_config_ RTC_GUARDED_BY(thread_checker_);
- // TODO(deadbeef): Don't duplicate information between
- // send_params/recv_params, rtp_extensions, options, etc.
- VideoSendParameters send_params_ RTC_GUARDED_BY(thread_checker_);
- VideoOptions default_send_options_ RTC_GUARDED_BY(thread_checker_);
- VideoRecvParameters recv_params_ RTC_GUARDED_BY(thread_checker_);
- int64_t last_stats_log_ms_ RTC_GUARDED_BY(thread_checker_);
- const bool discard_unknown_ssrc_packets_ RTC_GUARDED_BY(thread_checker_);
- // This is a stream param that comes from the remote description, but wasn't
- // signaled with any a=ssrc lines. It holds information that was signaled
- // before the unsignaled receive stream is created when the first packet is
- // received.
- StreamParams unsignaled_stream_params_ RTC_GUARDED_BY(thread_checker_);
- // Per peer connection crypto options that last for the lifetime of the peer
- // connection.
- const webrtc::CryptoOptions crypto_options_ RTC_GUARDED_BY(thread_checker_);
- // Optional frame transformer set on unsignaled streams.
- rtc::scoped_refptr<webrtc::FrameTransformerInterface>
- unsignaled_frame_transformer_ RTC_GUARDED_BY(thread_checker_);
- // Buffer for unhandled packets.
- std::unique_ptr<UnhandledPacketsBuffer> unknown_ssrc_packet_buffer_
- RTC_GUARDED_BY(thread_checker_);
- bool allow_codec_switching_ = false;
- absl::optional<EncoderSwitchRequestCallback::Config>
- requested_encoder_switch_;
- };
- class EncoderStreamFactory
- : public webrtc::VideoEncoderConfig::VideoStreamFactoryInterface {
- public:
- EncoderStreamFactory(std::string codec_name,
- int max_qp,
- bool is_screenshare,
- bool conference_mode)
- : EncoderStreamFactory(codec_name,
- max_qp,
- is_screenshare,
- conference_mode,
- nullptr) {}
- EncoderStreamFactory(std::string codec_name,
- int max_qp,
- bool is_screenshare,
- bool conference_mode,
- const webrtc::WebRtcKeyValueConfig* trials);
- private:
- std::vector<webrtc::VideoStream> CreateEncoderStreams(
- int width,
- int height,
- const webrtc::VideoEncoderConfig& encoder_config) override;
- std::vector<webrtc::VideoStream> CreateDefaultVideoStreams(
- int width,
- int height,
- const webrtc::VideoEncoderConfig& encoder_config,
- const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const;
- std::vector<webrtc::VideoStream>
- CreateSimulcastOrConferenceModeScreenshareStreams(
- int width,
- int height,
- const webrtc::VideoEncoderConfig& encoder_config,
- const absl::optional<webrtc::DataRate>& experimental_min_bitrate) const;
- const std::string codec_name_;
- const int max_qp_;
- const bool is_screenshare_;
- // Allows a screenshare specific configuration, which enables temporal
- // layering and various settings.
- const bool conference_mode_;
- const webrtc::FieldTrialBasedConfig fallback_trials_;
- const webrtc::WebRtcKeyValueConfig& trials_;
- };
- } // namespace cricket
- #endif // MEDIA_ENGINE_WEBRTC_VIDEO_ENGINE_H_
|