|  | /* | 
|  | *  Copyright (c) 2012 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 MODULES_PACING_PACED_SENDER_H_ | 
|  | #define MODULES_PACING_PACED_SENDER_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  | #include <stdint.h> | 
|  |  | 
|  | #include <atomic> | 
|  | #include <memory> | 
|  | #include <vector> | 
|  |  | 
|  | #include "absl/types/optional.h" | 
|  | #include "api/function_view.h" | 
|  | #include "api/transport/field_trial_based_config.h" | 
|  | #include "api/transport/network_types.h" | 
|  | #include "api/transport/webrtc_key_value_config.h" | 
|  | #include "modules/include/module.h" | 
|  | #include "modules/pacing/bitrate_prober.h" | 
|  | #include "modules/pacing/interval_budget.h" | 
|  | #include "modules/pacing/pacing_controller.h" | 
|  | #include "modules/pacing/packet_router.h" | 
|  | #include "modules/pacing/rtp_packet_pacer.h" | 
|  | #include "modules/rtp_rtcp/include/rtp_packet_sender.h" | 
|  | #include "modules/rtp_rtcp/source/rtp_packet_to_send.h" | 
|  | #include "modules/utility/include/process_thread.h" | 
|  | #include "rtc_base/synchronization/mutex.h" | 
|  | #include "rtc_base/thread_annotations.h" | 
|  |  | 
|  | namespace webrtc { | 
|  | class Clock; | 
|  | class RtcEventLog; | 
|  |  | 
|  | // TODO(bugs.webrtc.org/10937): Remove the inheritance from Module after | 
|  | // updating dependencies. | 
|  | class PacedSender : public Module, | 
|  | public RtpPacketPacer, | 
|  | public RtpPacketSender { | 
|  | public: | 
|  | // Expected max pacer delay in ms. If ExpectedQueueTime() is higher than | 
|  | // this value, the packet producers should wait (eg drop frames rather than | 
|  | // encoding them). Bitrate sent may temporarily exceed target set by | 
|  | // UpdateBitrate() so that this limit will be upheld. | 
|  | static const int64_t kMaxQueueLengthMs; | 
|  | // Pacing-rate relative to our target send rate. | 
|  | // Multiplicative factor that is applied to the target bitrate to calculate | 
|  | // the number of bytes that can be transmitted per interval. | 
|  | // Increasing this factor will result in lower delays in cases of bitrate | 
|  | // overshoots from the encoder. | 
|  | static const float kDefaultPaceMultiplier; | 
|  |  | 
|  | // TODO(bugs.webrtc.org/10937): Make the |process_thread| argument be non | 
|  | // optional once all callers have been updated. | 
|  | PacedSender(Clock* clock, | 
|  | PacketRouter* packet_router, | 
|  | RtcEventLog* event_log, | 
|  | const WebRtcKeyValueConfig* field_trials = nullptr, | 
|  | ProcessThread* process_thread = nullptr); | 
|  |  | 
|  | ~PacedSender() override; | 
|  |  | 
|  | // Methods implementing RtpPacketSender. | 
|  |  | 
|  | // Adds the packet to the queue and calls PacketRouter::SendPacket() when | 
|  | // it's time to send. | 
|  | void EnqueuePackets( | 
|  | std::vector<std::unique_ptr<RtpPacketToSend>> packet) override; | 
|  |  | 
|  | // Methods implementing RtpPacketPacer: | 
|  |  | 
|  | void CreateProbeCluster(DataRate bitrate, int cluster_id) override; | 
|  |  | 
|  | // Temporarily pause all sending. | 
|  | void Pause() override; | 
|  |  | 
|  | // Resume sending packets. | 
|  | void Resume() override; | 
|  |  | 
|  | void SetCongestionWindow(DataSize congestion_window_size) override; | 
|  | void UpdateOutstandingData(DataSize outstanding_data) override; | 
|  |  | 
|  | // Sets the pacing rates. Must be called once before packets can be sent. | 
|  | void SetPacingRates(DataRate pacing_rate, DataRate padding_rate) override; | 
|  |  | 
|  | // Currently audio traffic is not accounted by pacer and passed through. | 
|  | // With the introduction of audio BWE audio traffic will be accounted for | 
|  | // the pacer budget calculation. The audio traffic still will be injected | 
|  | // at high priority. | 
|  | void SetAccountForAudioPackets(bool account_for_audio) override; | 
|  |  | 
|  | void SetIncludeOverhead() override; | 
|  | void SetTransportOverhead(DataSize overhead_per_packet) override; | 
|  |  | 
|  | // Returns the time since the oldest queued packet was enqueued. | 
|  | TimeDelta OldestPacketWaitTime() const override; | 
|  |  | 
|  | DataSize QueueSizeData() const override; | 
|  |  | 
|  | // Returns the time when the first packet was sent; | 
|  | absl::optional<Timestamp> FirstSentPacketTime() const override; | 
|  |  | 
|  | // Returns the number of milliseconds it will take to send the current | 
|  | // packets in the queue, given the current size and bitrate, ignoring prio. | 
|  | TimeDelta ExpectedQueueTime() const override; | 
|  |  | 
|  | void SetQueueTimeLimit(TimeDelta limit) override; | 
|  |  | 
|  | // Below are methods specific to this implementation, such as things related | 
|  | // to module processing thread specifics or methods exposed for test. | 
|  |  | 
|  | private: | 
|  | // Methods implementing Module. | 
|  | // TODO(bugs.webrtc.org/10937): Remove the inheritance from Module once all | 
|  | // use of it has been cleared up. | 
|  |  | 
|  | // Returns the number of milliseconds until the module want a worker thread | 
|  | // to call Process. | 
|  | int64_t TimeUntilNextProcess() override; | 
|  |  | 
|  | // TODO(bugs.webrtc.org/10937): Make this private (and non virtual) once | 
|  | // dependencies have been updated to not call this via the PacedSender | 
|  | // interface. | 
|  | public: | 
|  | // Process any pending packets in the queue(s). | 
|  | void Process() override; | 
|  |  | 
|  | private: | 
|  | // Called when the prober is associated with a process thread. | 
|  | void ProcessThreadAttached(ProcessThread* process_thread) override; | 
|  |  | 
|  | // In dynamic process mode, refreshes the next process time. | 
|  | void MaybeWakupProcessThread(); | 
|  |  | 
|  | // Private implementation of Module to not expose those implementation details | 
|  | // publicly and control when the class is registered/deregistered. | 
|  | class ModuleProxy : public Module { | 
|  | public: | 
|  | explicit ModuleProxy(PacedSender* delegate) : delegate_(delegate) {} | 
|  |  | 
|  | private: | 
|  | int64_t TimeUntilNextProcess() override { | 
|  | return delegate_->TimeUntilNextProcess(); | 
|  | } | 
|  | void Process() override { return delegate_->Process(); } | 
|  | void ProcessThreadAttached(ProcessThread* process_thread) override { | 
|  | return delegate_->ProcessThreadAttached(process_thread); | 
|  | } | 
|  |  | 
|  | PacedSender* const delegate_; | 
|  | } module_proxy_{this}; | 
|  |  | 
|  | mutable Mutex mutex_; | 
|  | const PacingController::ProcessMode process_mode_; | 
|  | PacingController pacing_controller_ RTC_GUARDED_BY(mutex_); | 
|  |  | 
|  | Clock* const clock_; | 
|  | ProcessThread* const process_thread_; | 
|  | }; | 
|  | }  // namespace webrtc | 
|  | #endif  // MODULES_PACING_PACED_SENDER_H_ |