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:
Andrey Volykhin 2023-08-11 06:45:52 +00:00 committed by WebRTC LUCI CQ
parent 0e37f5ebd4
commit 6b51e728e6
4 changed files with 36 additions and 9 deletions

View File

@ -149,7 +149,12 @@ void FlexfecReceiver::ProcessReceivedPacket(
RTC_DCHECK_RUN_ON(&sequence_checker_); RTC_DCHECK_RUN_ON(&sequence_checker_);
// Decode. // Decode.
erasure_code_->DecodeFec(received_packet, &recovered_packets_); ForwardErrorCorrection::DecodeFecResult decode_result =
erasure_code_->DecodeFec(received_packet, &recovered_packets_);
if (decode_result.num_recovered_packets == 0) {
return;
}
// Return recovered packets through callback. // Return recovered packets through callback.
for (const auto& recovered_packet : recovered_packets_) { for (const auto& recovered_packet : recovered_packets_) {

View File

@ -665,8 +665,10 @@ bool ForwardErrorCorrection::RecoverPacket(const ReceivedFecPacket& fec_packet,
return true; return true;
} }
void ForwardErrorCorrection::AttemptRecovery( size_t ForwardErrorCorrection::AttemptRecovery(
RecoveredPacketList* recovered_packets) { RecoveredPacketList* recovered_packets) {
size_t num_recovered_packets = 0;
auto fec_packet_it = received_fec_packets_.begin(); auto fec_packet_it = received_fec_packets_.begin();
while (fec_packet_it != received_fec_packets_.end()) { while (fec_packet_it != received_fec_packets_.end()) {
// Search for each FEC packet's protected media packets. // Search for each FEC packet's protected media packets.
@ -683,6 +685,8 @@ void ForwardErrorCorrection::AttemptRecovery(
continue; continue;
} }
++num_recovered_packets;
auto* recovered_packet_ptr = recovered_packet.get(); auto* recovered_packet_ptr = recovered_packet.get();
// Add recovered packet to the list of recovered packets and update any // Add recovered packet to the list of recovered packets and update any
// FEC packets covering this packet with a pointer to the data. // FEC packets covering this packet with a pointer to the data.
@ -708,6 +712,8 @@ void ForwardErrorCorrection::AttemptRecovery(
fec_packet_it++; fec_packet_it++;
} }
} }
return num_recovered_packets;
} }
int ForwardErrorCorrection::NumCoveredPacketsMissing( int ForwardErrorCorrection::NumCoveredPacketsMissing(
@ -758,8 +764,9 @@ uint32_t ForwardErrorCorrection::ParseSsrc(const uint8_t* packet) {
return (packet[8] << 24) + (packet[9] << 16) + (packet[10] << 8) + packet[11]; return (packet[8] << 24) + (packet[9] << 16) + (packet[10] << 8) + packet[11];
} }
void ForwardErrorCorrection::DecodeFec(const ReceivedPacket& received_packet, ForwardErrorCorrection::DecodeFecResult ForwardErrorCorrection::DecodeFec(
RecoveredPacketList* recovered_packets) { const ReceivedPacket& received_packet,
RecoveredPacketList* recovered_packets) {
RTC_DCHECK(recovered_packets); RTC_DCHECK(recovered_packets);
const size_t max_media_packets = fec_header_reader_->MaxMediaPackets(); const size_t max_media_packets = fec_header_reader_->MaxMediaPackets();
@ -782,7 +789,10 @@ void ForwardErrorCorrection::DecodeFec(const ReceivedPacket& received_packet,
} }
InsertPacket(received_packet, recovered_packets); 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 { size_t ForwardErrorCorrection::MaxPacketOverhead() const {

View File

@ -229,8 +229,13 @@ class ForwardErrorCorrection {
// list will be valid until the next call to // list will be valid until the next call to
// DecodeFec(). // DecodeFec().
// //
void DecodeFec(const ReceivedPacket& received_packet, struct DecodeFecResult {
RecoveredPacketList* recovered_packets); // 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 // Get the number of generated FEC packets, given the number of media packets
// and the protection factor. // and the protection factor.
@ -302,7 +307,7 @@ class ForwardErrorCorrection {
// Attempt to recover missing packets, using the internally stored // Attempt to recover missing packets, using the internally stored
// received FEC packets. // received FEC packets.
void AttemptRecovery(RecoveredPacketList* recovered_packets); size_t AttemptRecovery(RecoveredPacketList* recovered_packets);
// Initializes headers and payload before the XOR operation // Initializes headers and payload before the XOR operation
// that recovers a packet. // that recovers a packet.

View File

@ -192,6 +192,7 @@ void UlpfecReceiver::ProcessReceivedFec() {
received_packets; received_packets;
received_packets.swap(received_packets_); received_packets.swap(received_packets_);
RtpHeaderExtensionMap* last_recovered_extension_map = nullptr; RtpHeaderExtensionMap* last_recovered_extension_map = nullptr;
size_t num_recovered_packets = 0;
for (const auto& received_packet : received_packets) { for (const auto& received_packet : received_packets) {
// Send received media packet to VCM. // Send received media packet to VCM.
@ -217,11 +218,17 @@ void UlpfecReceiver::ProcessReceivedFec() {
// different set of the RTP header extensions and thus different byte // different set of the RTP header extensions and thus different byte
// representation than the original packet, That will corrupt // representation than the original packet, That will corrupt
// FEC calculation. // FEC calculation.
fec_->DecodeFec(*received_packet, &recovered_packets_); ForwardErrorCorrection::DecodeFecResult decode_result =
fec_->DecodeFec(*received_packet, &recovered_packets_);
last_recovered_extension_map = &received_packet->extensions; 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. // Send any recovered media packets to VCM.
for (const auto& recovered_packet : recovered_packets_) { for (const auto& recovered_packet : recovered_packets_) {
if (recovered_packet->returned) { if (recovered_packet->returned) {