Split LastFir status out of RTCPReceiver::ReceiveInfo
This a pre-step for improving perfomance of the RTCPReceiver - rest of the ReceiveInfo is tmmbr related and can be handled only when tmmbr is explicitly enabled. BUG=webrtc:5565 Review-Url: https://codereview.webrtc.org/2681003003 Cr-Commit-Position: refs/heads/master@{#16667}
This commit is contained in:
parent
642943baea
commit
efa966b608
@ -55,6 +55,7 @@ using rtcp::ReportBlock;
|
|||||||
const int kRrTimeoutIntervals = 3;
|
const int kRrTimeoutIntervals = 3;
|
||||||
|
|
||||||
const int64_t kMaxWarningLogIntervalMs = 10000;
|
const int64_t kMaxWarningLogIntervalMs = 10000;
|
||||||
|
const int64_t kRtcpMinFrameLengthMs = 17;
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
@ -80,9 +81,6 @@ struct RTCPReceiver::ReceiveInformation {
|
|||||||
|
|
||||||
int64_t last_time_received_ms = 0;
|
int64_t last_time_received_ms = 0;
|
||||||
|
|
||||||
int64_t last_fir_request_ms = 0;
|
|
||||||
int32_t last_fir_sequence_number = -1;
|
|
||||||
|
|
||||||
bool ready_for_delete = false;
|
bool ready_for_delete = false;
|
||||||
|
|
||||||
std::vector<rtcp::TmmbItem> tmmbn;
|
std::vector<rtcp::TmmbItem> tmmbn;
|
||||||
@ -99,6 +97,13 @@ struct RTCPReceiver::ReportBlockWithRtt {
|
|||||||
size_t num_rtts = 0;
|
size_t num_rtts = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct RTCPReceiver::LastFirStatus {
|
||||||
|
LastFirStatus(int64_t now_ms, uint8_t sequence_number)
|
||||||
|
: request_ms(now_ms), sequence_number(sequence_number) {}
|
||||||
|
int64_t request_ms;
|
||||||
|
uint8_t sequence_number;
|
||||||
|
};
|
||||||
|
|
||||||
RTCPReceiver::RTCPReceiver(
|
RTCPReceiver::RTCPReceiver(
|
||||||
Clock* clock,
|
Clock* clock,
|
||||||
bool receiver_only,
|
bool receiver_only,
|
||||||
@ -683,6 +688,7 @@ void RTCPReceiver::HandleBye(const CommonHeader& rtcp_block) {
|
|||||||
if (receive_info)
|
if (receive_info)
|
||||||
receive_info->ready_for_delete = true;
|
receive_info->ready_for_delete = true;
|
||||||
|
|
||||||
|
last_fir_.erase(bye.sender_ssrc());
|
||||||
received_cnames_.erase(bye.sender_ssrc());
|
received_cnames_.erase(bye.sender_ssrc());
|
||||||
xr_rr_rtt_ms_ = 0;
|
xr_rr_rtt_ms_ = 0;
|
||||||
}
|
}
|
||||||
@ -880,8 +886,6 @@ void RTCPReceiver::HandleFir(const CommonHeader& rtcp_block,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReceiveInformation* receive_info = GetReceiveInformation(fir.sender_ssrc());
|
|
||||||
|
|
||||||
for (const rtcp::Fir::Request& fir_request : fir.requests()) {
|
for (const rtcp::Fir::Request& fir_request : fir.requests()) {
|
||||||
// Is it our sender that is requested to generate a new keyframe.
|
// Is it our sender that is requested to generate a new keyframe.
|
||||||
if (main_ssrc_ != fir_request.ssrc)
|
if (main_ssrc_ != fir_request.ssrc)
|
||||||
@ -889,18 +893,22 @@ void RTCPReceiver::HandleFir(const CommonHeader& rtcp_block,
|
|||||||
|
|
||||||
++packet_type_counter_.fir_packets;
|
++packet_type_counter_.fir_packets;
|
||||||
|
|
||||||
if (receive_info) {
|
int64_t now_ms = clock_->TimeInMilliseconds();
|
||||||
|
auto inserted = last_fir_.insert(std::make_pair(
|
||||||
|
fir.sender_ssrc(), LastFirStatus(now_ms, fir_request.seq_nr)));
|
||||||
|
if (!inserted.second) { // There was already an entry.
|
||||||
|
LastFirStatus* last_fir = &inserted.first->second;
|
||||||
|
|
||||||
// Check if we have reported this FIRSequenceNumber before.
|
// Check if we have reported this FIRSequenceNumber before.
|
||||||
if (fir_request.seq_nr == receive_info->last_fir_sequence_number)
|
if (fir_request.seq_nr == last_fir->sequence_number)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
int64_t now_ms = clock_->TimeInMilliseconds();
|
|
||||||
// Sanity: don't go crazy with the callbacks.
|
// Sanity: don't go crazy with the callbacks.
|
||||||
if (now_ms - receive_info->last_fir_request_ms < RTCP_MIN_FRAME_LENGTH_MS)
|
if (now_ms - last_fir->request_ms < kRtcpMinFrameLengthMs)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
receive_info->last_fir_request_ms = now_ms;
|
last_fir->request_ms = now_ms;
|
||||||
receive_info->last_fir_sequence_number = fir_request.seq_nr;
|
last_fir->sequence_number = fir_request.seq_nr;
|
||||||
}
|
}
|
||||||
// Received signal that we need to send a new key frame.
|
// Received signal that we need to send a new key frame.
|
||||||
packet_information->packet_type_flags |= kRtcpFir;
|
packet_information->packet_type_flags |= kRtcpFir;
|
||||||
|
|||||||
@ -119,6 +119,7 @@ class RTCPReceiver {
|
|||||||
struct PacketInformation;
|
struct PacketInformation;
|
||||||
struct ReceiveInformation;
|
struct ReceiveInformation;
|
||||||
struct ReportBlockWithRtt;
|
struct ReportBlockWithRtt;
|
||||||
|
struct LastFirStatus;
|
||||||
// Mapped by remote ssrc.
|
// Mapped by remote ssrc.
|
||||||
using ReceivedInfoMap = std::map<uint32_t, ReceiveInformation>;
|
using ReceivedInfoMap = std::map<uint32_t, ReceiveInformation>;
|
||||||
// RTCP report blocks mapped by remote SSRC.
|
// RTCP report blocks mapped by remote SSRC.
|
||||||
@ -245,6 +246,7 @@ class RTCPReceiver {
|
|||||||
ReportBlockMap received_report_blocks_ GUARDED_BY(rtcp_receiver_lock_);
|
ReportBlockMap received_report_blocks_ GUARDED_BY(rtcp_receiver_lock_);
|
||||||
ReceivedInfoMap received_infos_ GUARDED_BY(rtcp_receiver_lock_);
|
ReceivedInfoMap received_infos_ GUARDED_BY(rtcp_receiver_lock_);
|
||||||
int64_t oldest_received_info_ms_ GUARDED_BY(rtcp_receiver_lock_);
|
int64_t oldest_received_info_ms_ GUARDED_BY(rtcp_receiver_lock_);
|
||||||
|
std::map<uint32_t, LastFirStatus> last_fir_ GUARDED_BY(rtcp_receiver_lock_);
|
||||||
std::map<uint32_t, std::string> received_cnames_
|
std::map<uint32_t, std::string> received_cnames_
|
||||||
GUARDED_BY(rtcp_receiver_lock_);
|
GUARDED_BY(rtcp_receiver_lock_);
|
||||||
|
|
||||||
|
|||||||
@ -23,7 +23,6 @@ enum { RTCP_INTERVAL_VIDEO_MS = 1000 };
|
|||||||
enum { RTCP_INTERVAL_AUDIO_MS = 5000 };
|
enum { RTCP_INTERVAL_AUDIO_MS = 5000 };
|
||||||
enum { RTCP_SEND_BEFORE_KEY_FRAME_MS = 100 };
|
enum { RTCP_SEND_BEFORE_KEY_FRAME_MS = 100 };
|
||||||
enum { RTCP_MAX_REPORT_BLOCKS = 31 }; // RFC 3550 page 37
|
enum { RTCP_MAX_REPORT_BLOCKS = 31 }; // RFC 3550 page 37
|
||||||
enum { RTCP_MIN_FRAME_LENGTH_MS = 17 };
|
|
||||||
enum {
|
enum {
|
||||||
kRtcpAppCode_DATA_SIZE = 32 * 4
|
kRtcpAppCode_DATA_SIZE = 32 * 4
|
||||||
}; // multiple of 4, this is not a limitation of the size
|
}; // multiple of 4, this is not a limitation of the size
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user