123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202 |
- #ifndef VIDEO_VIDEO_SEND_STREAM_IMPL_H_
- #define VIDEO_VIDEO_SEND_STREAM_IMPL_H_
- #include <stddef.h>
- #include <stdint.h>
- #include <atomic>
- #include <map>
- #include <memory>
- #include <vector>
- #include "absl/types/optional.h"
- #include "api/fec_controller.h"
- #include "api/rtc_event_log/rtc_event_log.h"
- #include "api/video/encoded_image.h"
- #include "api/video/video_bitrate_allocation.h"
- #include "api/video/video_bitrate_allocator.h"
- #include "api/video/video_stream_encoder_interface.h"
- #include "api/video_codecs/video_encoder.h"
- #include "api/video_codecs/video_encoder_config.h"
- #include "call/bitrate_allocator.h"
- #include "call/rtp_config.h"
- #include "call/rtp_transport_controller_send_interface.h"
- #include "call/rtp_video_sender_interface.h"
- #include "modules/include/module_common_types.h"
- #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
- #include "modules/utility/include/process_thread.h"
- #include "modules/video_coding/include/video_codec_interface.h"
- #include "rtc_base/experiments/field_trial_parser.h"
- #include "rtc_base/synchronization/mutex.h"
- #include "rtc_base/task_queue.h"
- #include "rtc_base/task_utils/repeating_task.h"
- #include "rtc_base/thread_annotations.h"
- #include "rtc_base/weak_ptr.h"
- #include "video/encoder_rtcp_feedback.h"
- #include "video/send_delay_stats.h"
- #include "video/send_statistics_proxy.h"
- #include "video/video_send_stream.h"
- namespace webrtc {
- namespace internal {
- struct PacingConfig {
- PacingConfig();
- PacingConfig(const PacingConfig&);
- PacingConfig& operator=(const PacingConfig&) = default;
- ~PacingConfig();
- FieldTrialParameter<double> pacing_factor;
- FieldTrialParameter<TimeDelta> max_pacing_delay;
- };
- class VideoSendStreamImpl : public webrtc::BitrateAllocatorObserver,
- public VideoStreamEncoderInterface::EncoderSink,
- public VideoBitrateAllocationObserver {
- public:
- VideoSendStreamImpl(
- Clock* clock,
- SendStatisticsProxy* stats_proxy,
- rtc::TaskQueue* worker_queue,
- RtcpRttStats* call_stats,
- RtpTransportControllerSendInterface* transport,
- BitrateAllocatorInterface* bitrate_allocator,
- SendDelayStats* send_delay_stats,
- VideoStreamEncoderInterface* video_stream_encoder,
- RtcEventLog* event_log,
- const VideoSendStream::Config* config,
- int initial_encoder_max_bitrate,
- double initial_encoder_bitrate_priority,
- std::map<uint32_t, RtpState> suspended_ssrcs,
- std::map<uint32_t, RtpPayloadState> suspended_payload_states,
- VideoEncoderConfig::ContentType content_type,
- std::unique_ptr<FecController> fec_controller);
- ~VideoSendStreamImpl() override;
-
-
-
-
-
- void RegisterProcessThread(ProcessThread* module_process_thread);
- void DeRegisterProcessThread();
- void DeliverRtcp(const uint8_t* packet, size_t length);
- void UpdateActiveSimulcastLayers(const std::vector<bool> active_layers);
- void Start();
- void Stop();
-
- std::map<uint32_t, RtpState> GetRtpStates() const;
- std::map<uint32_t, RtpPayloadState> GetRtpPayloadStates() const;
- absl::optional<float> configured_pacing_factor_;
- private:
-
- uint32_t OnBitrateUpdated(BitrateAllocationUpdate update) override;
- void OnEncoderConfigurationChanged(
- std::vector<VideoStream> streams,
- bool is_svc,
- VideoEncoderConfig::ContentType content_type,
- int min_transmit_bitrate_bps) override;
-
-
-
- EncodedImageCallback::Result OnEncodedImage(
- const EncodedImage& encoded_image,
- const CodecSpecificInfo* codec_specific_info) override;
-
- void OnDroppedFrame(EncodedImageCallback::DropReason reason) override;
-
- void OnBitrateAllocationUpdated(
- const VideoBitrateAllocation& allocation) override;
-
- void StartupVideoSendStream();
-
-
- void StopVideoSendStream() RTC_RUN_ON(worker_queue_);
- void ConfigureProtection();
- void ConfigureSsrcs();
- void SignalEncoderTimedOut();
- void SignalEncoderActive();
- MediaStreamAllocationConfig GetAllocationConfig() const
- RTC_RUN_ON(worker_queue_);
- Clock* const clock_;
- const bool has_alr_probing_;
- const PacingConfig pacing_config_;
- SendStatisticsProxy* const stats_proxy_;
- const VideoSendStream::Config* const config_;
- rtc::TaskQueue* const worker_queue_;
- RepeatingTaskHandle check_encoder_activity_task_
- RTC_GUARDED_BY(worker_queue_);
- std::atomic_bool activity_;
- bool timed_out_ RTC_GUARDED_BY(worker_queue_);
- RtpTransportControllerSendInterface* const transport_;
- BitrateAllocatorInterface* const bitrate_allocator_;
- Mutex ivf_writers_mutex_;
- bool disable_padding_;
- int max_padding_bitrate_;
- int encoder_min_bitrate_bps_;
- uint32_t encoder_max_bitrate_bps_;
- uint32_t encoder_target_rate_bps_;
- double encoder_bitrate_priority_;
- bool has_packet_feedback_;
- VideoStreamEncoderInterface* const video_stream_encoder_;
- EncoderRtcpFeedback encoder_feedback_;
- RtcpBandwidthObserver* const bandwidth_observer_;
- RtpVideoSenderInterface* const rtp_video_sender_;
-
-
-
- rtc::WeakPtr<VideoSendStreamImpl> weak_ptr_;
-
-
- rtc::WeakPtrFactory<VideoSendStreamImpl> weak_ptr_factory_;
-
-
- struct VbaSendContext {
- VideoBitrateAllocation last_sent_allocation;
- absl::optional<VideoBitrateAllocation> throttled_allocation;
- int64_t last_send_time_ms;
- };
- absl::optional<VbaSendContext> video_bitrate_allocation_context_
- RTC_GUARDED_BY(worker_queue_);
- };
- }
- }
- #endif
|