Index: webrtc/modules/rtp_rtcp/source/forward_error_correction.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc b/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc |
index 4de8fb3a46550a0f1af89735bcd422e20acb1e29..b85d813790d57d099eda23688d211e4f9b73ba5a 100644 |
--- a/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc |
+++ b/webrtc/modules/rtp_rtcp/source/forward_error_correction.cc |
@@ -217,6 +217,7 @@ void ForwardErrorCorrection::GenerateFecBitStrings( |
kFecHeaderSize + ulp_header_size - kRtpHeaderSize; |
for (int i = 0; i < num_fec_packets; ++i) { |
+ Packet* const fec_packet = &generated_fec_packets_[i]; |
PacketList::const_iterator media_list_it = media_packet_list.begin(); |
uint32_t pkt_mask_idx = i * num_mask_bytes; |
uint32_t media_pkt_idx = 0; |
@@ -234,42 +235,40 @@ void ForwardErrorCorrection::GenerateFecBitStrings( |
fec_packet_length = media_packet->length + fec_rtp_offset; |
// On the first protected packet, we don't need to XOR. |
- if (generated_fec_packets_[i].length == 0) { |
+ if (fec_packet->length == 0) { |
// Copy the first 2 bytes of the RTP header. |
- memcpy(generated_fec_packets_[i].data, media_packet->data, 2); |
+ memcpy(fec_packet->data, media_packet->data, 2); |
// Copy the 5th to 8th bytes of the RTP header. |
- memcpy(&generated_fec_packets_[i].data[4], &media_packet->data[4], 4); |
+ memcpy(&fec_packet->data[4], &media_packet->data[4], 4); |
// Copy network-ordered payload size. |
- memcpy(&generated_fec_packets_[i].data[8], media_payload_length, 2); |
+ memcpy(&fec_packet->data[8], media_payload_length, 2); |
// Copy RTP payload, leaving room for the ULP header. |
- memcpy( |
- &generated_fec_packets_[i].data[kFecHeaderSize + ulp_header_size], |
- &media_packet->data[kRtpHeaderSize], |
- media_packet->length - kRtpHeaderSize); |
+ memcpy(&fec_packet->data[kFecHeaderSize + ulp_header_size], |
+ &media_packet->data[kRtpHeaderSize], |
+ media_packet->length - kRtpHeaderSize); |
} else { |
// XOR with the first 2 bytes of the RTP header. |
- generated_fec_packets_[i].data[0] ^= media_packet->data[0]; |
- generated_fec_packets_[i].data[1] ^= media_packet->data[1]; |
+ fec_packet->data[0] ^= media_packet->data[0]; |
+ fec_packet->data[1] ^= media_packet->data[1]; |
// XOR with the 5th to 8th bytes of the RTP header. |
for (uint32_t j = 4; j < 8; ++j) { |
- generated_fec_packets_[i].data[j] ^= media_packet->data[j]; |
+ fec_packet->data[j] ^= media_packet->data[j]; |
} |
// XOR with the network-ordered payload size. |
- generated_fec_packets_[i].data[8] ^= media_payload_length[0]; |
- generated_fec_packets_[i].data[9] ^= media_payload_length[1]; |
+ fec_packet->data[8] ^= media_payload_length[0]; |
+ fec_packet->data[9] ^= media_payload_length[1]; |
// XOR with RTP payload, leaving room for the ULP header. |
for (int32_t j = kFecHeaderSize + ulp_header_size; |
j < fec_packet_length; j++) { |
- generated_fec_packets_[i].data[j] ^= |
- media_packet->data[j - fec_rtp_offset]; |
+ fec_packet->data[j] ^= media_packet->data[j - fec_rtp_offset]; |
} |
} |
- if (fec_packet_length > generated_fec_packets_[i].length) { |
- generated_fec_packets_[i].length = fec_packet_length; |
+ if (fec_packet_length > fec_packet->length) { |
+ fec_packet->length = fec_packet_length; |
} |
} |
media_list_it++; |
@@ -281,7 +280,7 @@ void ForwardErrorCorrection::GenerateFecBitStrings( |
pkt_mask_idx += media_pkt_idx / 8; |
media_pkt_idx %= 8; |
} |
- RTC_DCHECK_GT(generated_fec_packets_[i].length, 0u) |
+ RTC_DCHECK_GT(fec_packet->length, 0u) |
<< "Packet mask is wrong or poorly designed."; |
} |
} |
@@ -424,28 +423,29 @@ void ForwardErrorCorrection::GenerateFecUlpHeaders( |
l_bit ? kUlpHeaderSizeLBitSet : kUlpHeaderSizeLBitClear; |
for (int i = 0; i < num_fec_packets; ++i) { |
+ Packet* const fec_packet = &generated_fec_packets_[i]; |
// -- FEC header -- |
- generated_fec_packets_[i].data[0] &= 0x7f; // Set E to zero. |
+ fec_packet->data[0] &= 0x7f; // Set E to zero. |
if (l_bit == 0) { |
- generated_fec_packets_[i].data[0] &= 0xbf; // Clear the L bit. |
+ fec_packet->data[0] &= 0xbf; // Clear the L bit. |
} else { |
- generated_fec_packets_[i].data[0] |= 0x40; // Set the L bit. |
+ fec_packet->data[0] |= 0x40; // Set the L bit. |
} |
// Two byte sequence number from first RTP packet to SN base. |
// We use the same sequence number base for every FEC packet, |
// but that's not required in general. |
- memcpy(&generated_fec_packets_[i].data[2], &media_packet->data[2], 2); |
+ memcpy(&fec_packet->data[2], &media_packet->data[2], 2); |
// -- ULP header -- |
// Copy the payload size to the protection length field. |
// (We protect the entire packet.) |
ByteWriter<uint16_t>::WriteBigEndian( |
- &generated_fec_packets_[i].data[10], |
- generated_fec_packets_[i].length - kFecHeaderSize - ulp_header_size); |
+ &fec_packet->data[10], |
+ fec_packet->length - kFecHeaderSize - ulp_header_size); |
// Copy the packet mask. |
- memcpy(&generated_fec_packets_[i].data[12], |
- &packet_mask[i * num_mask_bytes], num_mask_bytes); |
+ memcpy(&fec_packet->data[12], &packet_mask[i * num_mask_bytes], |
+ num_mask_bytes); |
} |
} |