fec: Skip traversal the list of recovered packets if possible
Do not traverse the list of recovered media packets if none of them was recovered through FEC recovery procedure. Bug: None Change-Id: Ib3aa59c946919fab08f0e20fcf279b1b8032d0e3 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/315320 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Danil Chapovalov <danilchap@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Auto-Submit: Andrei Volykhin <andrey.volykhin@lge.com> Cr-Commit-Position: refs/heads/main@{#40546}
This commit is contained in:
parent
0e37f5ebd4
commit
6b51e728e6
@ -149,8 +149,13 @@ void FlexfecReceiver::ProcessReceivedPacket(
|
||||
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
||||
|
||||
// Decode.
|
||||
ForwardErrorCorrection::DecodeFecResult decode_result =
|
||||
erasure_code_->DecodeFec(received_packet, &recovered_packets_);
|
||||
|
||||
if (decode_result.num_recovered_packets == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Return recovered packets through callback.
|
||||
for (const auto& recovered_packet : recovered_packets_) {
|
||||
RTC_CHECK(recovered_packet);
|
||||
|
||||
@ -665,8 +665,10 @@ bool ForwardErrorCorrection::RecoverPacket(const ReceivedFecPacket& fec_packet,
|
||||
return true;
|
||||
}
|
||||
|
||||
void ForwardErrorCorrection::AttemptRecovery(
|
||||
size_t ForwardErrorCorrection::AttemptRecovery(
|
||||
RecoveredPacketList* recovered_packets) {
|
||||
size_t num_recovered_packets = 0;
|
||||
|
||||
auto fec_packet_it = received_fec_packets_.begin();
|
||||
while (fec_packet_it != received_fec_packets_.end()) {
|
||||
// Search for each FEC packet's protected media packets.
|
||||
@ -683,6 +685,8 @@ void ForwardErrorCorrection::AttemptRecovery(
|
||||
continue;
|
||||
}
|
||||
|
||||
++num_recovered_packets;
|
||||
|
||||
auto* recovered_packet_ptr = recovered_packet.get();
|
||||
// Add recovered packet to the list of recovered packets and update any
|
||||
// FEC packets covering this packet with a pointer to the data.
|
||||
@ -708,6 +712,8 @@ void ForwardErrorCorrection::AttemptRecovery(
|
||||
fec_packet_it++;
|
||||
}
|
||||
}
|
||||
|
||||
return num_recovered_packets;
|
||||
}
|
||||
|
||||
int ForwardErrorCorrection::NumCoveredPacketsMissing(
|
||||
@ -758,7 +764,8 @@ uint32_t ForwardErrorCorrection::ParseSsrc(const uint8_t* packet) {
|
||||
return (packet[8] << 24) + (packet[9] << 16) + (packet[10] << 8) + packet[11];
|
||||
}
|
||||
|
||||
void ForwardErrorCorrection::DecodeFec(const ReceivedPacket& received_packet,
|
||||
ForwardErrorCorrection::DecodeFecResult ForwardErrorCorrection::DecodeFec(
|
||||
const ReceivedPacket& received_packet,
|
||||
RecoveredPacketList* recovered_packets) {
|
||||
RTC_DCHECK(recovered_packets);
|
||||
|
||||
@ -782,7 +789,10 @@ void ForwardErrorCorrection::DecodeFec(const ReceivedPacket& received_packet,
|
||||
}
|
||||
|
||||
InsertPacket(received_packet, recovered_packets);
|
||||
AttemptRecovery(recovered_packets);
|
||||
|
||||
DecodeFecResult decode_result;
|
||||
decode_result.num_recovered_packets = AttemptRecovery(recovered_packets);
|
||||
return decode_result;
|
||||
}
|
||||
|
||||
size_t ForwardErrorCorrection::MaxPacketOverhead() const {
|
||||
|
||||
@ -229,7 +229,12 @@ class ForwardErrorCorrection {
|
||||
// list will be valid until the next call to
|
||||
// DecodeFec().
|
||||
//
|
||||
void DecodeFec(const ReceivedPacket& received_packet,
|
||||
struct DecodeFecResult {
|
||||
// Number of recovered media packets using FEC.
|
||||
size_t num_recovered_packets = 0;
|
||||
};
|
||||
|
||||
DecodeFecResult DecodeFec(const ReceivedPacket& received_packet,
|
||||
RecoveredPacketList* recovered_packets);
|
||||
|
||||
// Get the number of generated FEC packets, given the number of media packets
|
||||
@ -302,7 +307,7 @@ class ForwardErrorCorrection {
|
||||
|
||||
// Attempt to recover missing packets, using the internally stored
|
||||
// received FEC packets.
|
||||
void AttemptRecovery(RecoveredPacketList* recovered_packets);
|
||||
size_t AttemptRecovery(RecoveredPacketList* recovered_packets);
|
||||
|
||||
// Initializes headers and payload before the XOR operation
|
||||
// that recovers a packet.
|
||||
|
||||
@ -192,6 +192,7 @@ void UlpfecReceiver::ProcessReceivedFec() {
|
||||
received_packets;
|
||||
received_packets.swap(received_packets_);
|
||||
RtpHeaderExtensionMap* last_recovered_extension_map = nullptr;
|
||||
size_t num_recovered_packets = 0;
|
||||
|
||||
for (const auto& received_packet : received_packets) {
|
||||
// Send received media packet to VCM.
|
||||
@ -217,11 +218,17 @@ void UlpfecReceiver::ProcessReceivedFec() {
|
||||
// different set of the RTP header extensions and thus different byte
|
||||
// representation than the original packet, That will corrupt
|
||||
// FEC calculation.
|
||||
ForwardErrorCorrection::DecodeFecResult decode_result =
|
||||
fec_->DecodeFec(*received_packet, &recovered_packets_);
|
||||
last_recovered_extension_map = &received_packet->extensions;
|
||||
num_recovered_packets += decode_result.num_recovered_packets;
|
||||
}
|
||||
}
|
||||
|
||||
if (num_recovered_packets == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Send any recovered media packets to VCM.
|
||||
for (const auto& recovered_packet : recovered_packets_) {
|
||||
if (recovered_packet->returned) {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user