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_);
|
RTC_DCHECK_RUN_ON(&sequence_checker_);
|
||||||
|
|
||||||
// Decode.
|
// Decode.
|
||||||
|
ForwardErrorCorrection::DecodeFecResult decode_result =
|
||||||
erasure_code_->DecodeFec(received_packet, &recovered_packets_);
|
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_) {
|
||||||
RTC_CHECK(recovered_packet);
|
RTC_CHECK(recovered_packet);
|
||||||
|
|||||||
@ -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,7 +764,8 @@ 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(
|
||||||
|
const ReceivedPacket& received_packet,
|
||||||
RecoveredPacketList* recovered_packets) {
|
RecoveredPacketList* recovered_packets) {
|
||||||
RTC_DCHECK(recovered_packets);
|
RTC_DCHECK(recovered_packets);
|
||||||
|
|
||||||
@ -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 {
|
||||||
|
|||||||
@ -229,7 +229,12 @@ 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 {
|
||||||
|
// Number of recovered media packets using FEC.
|
||||||
|
size_t num_recovered_packets = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
DecodeFecResult DecodeFec(const ReceivedPacket& received_packet,
|
||||||
RecoveredPacketList* recovered_packets);
|
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
|
||||||
@ -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.
|
||||||
|
|||||||
@ -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.
|
||||||
|
ForwardErrorCorrection::DecodeFecResult decode_result =
|
||||||
fec_->DecodeFec(*received_packet, &recovered_packets_);
|
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) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user