| Index: webrtc/modules/rtp_rtcp/source/rtp_sender_video.h
|
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.h b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.h
|
| index 9fb4648b82e2138e2bfdb0e75e2d87a816710b37..e4a24052e52f88f6f9edbf204425f6614496a267 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/rtp_sender_video.h
|
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_video.h
|
| @@ -11,9 +11,8 @@
|
| #ifndef WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_VIDEO_H_
|
| #define WEBRTC_MODULES_RTP_RTCP_SOURCE_RTP_SENDER_VIDEO_H_
|
|
|
| -#include <list>
|
| +#include <map>
|
| #include <memory>
|
| -#include <vector>
|
|
|
| #include "webrtc/common_types.h"
|
| #include "webrtc/modules/rtp_rtcp/include/flexfec_sender.h"
|
| @@ -32,10 +31,13 @@
|
| #include "webrtc/typedefs.h"
|
|
|
| namespace webrtc {
|
| +class RtpPacketizer;
|
| class RtpPacketToSend;
|
|
|
| class RTPSenderVideo {
|
| public:
|
| + static constexpr int64_t kTLRateWindowSizeMs = 2500;
|
| +
|
| RTPSenderVideo(Clock* clock,
|
| RTPSender* rtpSender,
|
| FlexfecSender* flexfec_sender);
|
| @@ -55,7 +57,8 @@ class RTPSenderVideo {
|
| const uint8_t* payload_data,
|
| size_t payload_size,
|
| const RTPFragmentationHeader* fragmentation,
|
| - const RTPVideoHeader* video_header);
|
| + const RTPVideoHeader* video_header,
|
| + int64_t expected_retransmission_time_ms);
|
|
|
| void SetVideoCodecType(RtpVideoCodecTypes type);
|
|
|
| @@ -76,7 +79,24 @@ class RTPSenderVideo {
|
| int SelectiveRetransmissions() const;
|
| void SetSelectiveRetransmissions(uint8_t settings);
|
|
|
| + protected:
|
| + static uint8_t GetTemporalId(const RTPVideoHeader& header);
|
| + StorageType GetStorageType(uint8_t temporal_id,
|
| + int32_t retransmission_settings,
|
| + int64_t expected_retransmission_time_ms);
|
| +
|
| private:
|
| + struct TemporalLayerStats {
|
| + TemporalLayerStats()
|
| + : frame_rate_fp1000s(kTLRateWindowSizeMs, 1000 * 1000),
|
| + last_frame_time_ms(0) {}
|
| + // Frame rate, in frames per 1000 seconds. This essentially turns the fps
|
| + // value into a fixed point value with three decimals. Improves precision at
|
| + // low frame rates.
|
| + RateStatistics frame_rate_fp1000s;
|
| + int64_t last_frame_time_ms;
|
| + };
|
| +
|
| size_t CalculateFecPacketOverhead() const EXCLUSIVE_LOCKS_REQUIRED(crit_);
|
|
|
| void SendVideoPacket(std::unique_ptr<RtpPacketToSend> packet,
|
| @@ -103,6 +123,10 @@ class RTPSenderVideo {
|
|
|
| bool flexfec_enabled() const { return flexfec_sender_ != nullptr; }
|
|
|
| + bool UpdateConditionalRetransmit(uint8_t temporal_id,
|
| + int64_t expected_retransmission_time_ms)
|
| + EXCLUSIVE_LOCKS_REQUIRED(stats_crit_);
|
| +
|
| RTPSender* const rtp_sender_;
|
| Clock* const clock_;
|
|
|
| @@ -131,6 +155,10 @@ class RTPSenderVideo {
|
| RateStatistics fec_bitrate_ GUARDED_BY(stats_crit_);
|
| // Bitrate used for video payload and RTP headers.
|
| RateStatistics video_bitrate_ GUARDED_BY(stats_crit_);
|
| +
|
| + std::map<int, TemporalLayerStats> frame_stats_by_temporal_layer_
|
| + GUARDED_BY(stats_crit_);
|
| +
|
| OneTimeEvent first_frame_sent_;
|
| };
|
|
|
|
|