| Index: webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.cc
|
| diff --git a/webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.cc b/webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.cc
|
| index 6d9be90de16e56188735ab0cd6aee896edb3f5de..f2fe43276d25f906dba3e660d90381859a5121a9 100644
|
| --- a/webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.cc
|
| +++ b/webrtc/modules/rtp_rtcp/source/forward_error_correction_internal.cc
|
| @@ -37,8 +37,11 @@ enum ProtectionMode {
|
| // [0, num_rows * num_sub_mask_bytes]
|
| // \param[out] packet_mask A pointer to hold the output mask, of size
|
| // [0, x * num_mask_bytes], where x >= num_rows.
|
| -void FitSubMask(int num_mask_bytes, int num_sub_mask_bytes, int num_rows,
|
| - const uint8_t* sub_mask, uint8_t* packet_mask) {
|
| +void FitSubMask(int num_mask_bytes,
|
| + int num_sub_mask_bytes,
|
| + int num_rows,
|
| + const uint8_t* sub_mask,
|
| + uint8_t* packet_mask) {
|
| if (num_mask_bytes == num_sub_mask_bytes) {
|
| memcpy(packet_mask, sub_mask, num_rows * num_sub_mask_bytes);
|
| } else {
|
| @@ -70,13 +73,15 @@ void FitSubMask(int num_mask_bytes, int num_sub_mask_bytes, int num_rows,
|
| // \param[out] packet_mask A pointer to hold the output mask, of size
|
| // [0, x * num_mask_bytes],
|
| // where x >= end_row_fec.
|
| -// TODO (marpan): This function is doing three things at the same time:
|
| +// TODO(marpan): This function is doing three things at the same time:
|
| // shift within a byte, byte shift and resizing.
|
| // Split up into subroutines.
|
| -void ShiftFitSubMask(int num_mask_bytes, int res_mask_bytes,
|
| - int num_column_shift, int end_row, const uint8_t* sub_mask,
|
| +void ShiftFitSubMask(int num_mask_bytes,
|
| + int res_mask_bytes,
|
| + int num_column_shift,
|
| + int end_row,
|
| + const uint8_t* sub_mask,
|
| uint8_t* packet_mask) {
|
| -
|
| // Number of bit shifts within a byte
|
| const int num_bit_shifts = (num_column_shift % 8);
|
| const int num_byte_shifts = num_column_shift >> 3;
|
| @@ -128,7 +133,6 @@ void ShiftFitSubMask(int num_mask_bytes, int res_mask_bytes,
|
| // For the first byte in the row (j=0 case).
|
| shift_right_curr_byte = sub_mask[pkt_mask_idx2] >> num_bit_shifts;
|
| packet_mask[pkt_mask_idx] = shift_right_curr_byte;
|
| -
|
| }
|
| }
|
| } // namespace
|
| @@ -151,7 +155,9 @@ FecMaskType PacketMaskTable::InitMaskType(FecMaskType fec_mask_type,
|
| assert(num_media_packets <= static_cast<int>(sizeof(kPacketMaskRandomTbl) /
|
| sizeof(*kPacketMaskRandomTbl)));
|
| switch (fec_mask_type) {
|
| - case kFecMaskRandom: { return kFecMaskRandom; }
|
| + case kFecMaskRandom: {
|
| + return kFecMaskRandom;
|
| + }
|
| case kFecMaskBursty: {
|
| int max_media_packets = static_cast<int>(sizeof(kPacketMaskBurstyTbl) /
|
| sizeof(*kPacketMaskBurstyTbl));
|
| @@ -170,17 +176,24 @@ FecMaskType PacketMaskTable::InitMaskType(FecMaskType fec_mask_type,
|
| // |fec_mask_type|.
|
| const uint8_t*** PacketMaskTable::InitMaskTable(FecMaskType fec_mask_type) {
|
| switch (fec_mask_type) {
|
| - case kFecMaskRandom: { return kPacketMaskRandomTbl; }
|
| - case kFecMaskBursty: { return kPacketMaskBurstyTbl; }
|
| + case kFecMaskRandom: {
|
| + return kPacketMaskRandomTbl;
|
| + }
|
| + case kFecMaskBursty: {
|
| + return kPacketMaskBurstyTbl;
|
| + }
|
| }
|
| assert(false);
|
| return kPacketMaskRandomTbl;
|
| }
|
|
|
| // Remaining protection after important (first partition) packet protection
|
| -void RemainingPacketProtection(int num_media_packets, int num_fec_remaining,
|
| - int num_fec_for_imp_packets, int num_mask_bytes,
|
| - ProtectionMode mode, uint8_t* packet_mask,
|
| +void RemainingPacketProtection(int num_media_packets,
|
| + int num_fec_remaining,
|
| + int num_fec_for_imp_packets,
|
| + int num_mask_bytes,
|
| + ProtectionMode mode,
|
| + uint8_t* packet_mask,
|
| const PacketMaskTable& mask_table) {
|
| if (mode == kModeNoOverlap) {
|
| // sub_mask21
|
| @@ -191,8 +204,10 @@ void RemainingPacketProtection(int num_media_packets, int num_fec_remaining,
|
| const int res_mask_bytes =
|
| (l_bit == 1) ? kMaskSizeLBitSet : kMaskSizeLBitClear;
|
|
|
| - const uint8_t* packet_mask_sub_21 = mask_table.fec_packet_mask_table()[
|
| - num_media_packets - num_fec_for_imp_packets - 1][num_fec_remaining - 1];
|
| + const uint8_t* packet_mask_sub_21 =
|
| + mask_table.fec_packet_mask_table()[num_media_packets -
|
| + num_fec_for_imp_packets -
|
| + 1][num_fec_remaining - 1];
|
|
|
| ShiftFitSubMask(num_mask_bytes, res_mask_bytes, num_fec_for_imp_packets,
|
| (num_fec_for_imp_packets + num_fec_remaining),
|
| @@ -201,8 +216,9 @@ void RemainingPacketProtection(int num_media_packets, int num_fec_remaining,
|
| } else if (mode == kModeOverlap || mode == kModeBiasFirstPacket) {
|
| // sub_mask22
|
|
|
| - const uint8_t* packet_mask_sub_22 = mask_table
|
| - .fec_packet_mask_table()[num_media_packets - 1][num_fec_remaining - 1];
|
| + const uint8_t* packet_mask_sub_22 =
|
| + mask_table.fec_packet_mask_table()[num_media_packets -
|
| + 1][num_fec_remaining - 1];
|
|
|
| FitSubMask(num_mask_bytes, num_mask_bytes, num_fec_remaining,
|
| packet_mask_sub_22,
|
| @@ -217,41 +233,42 @@ void RemainingPacketProtection(int num_media_packets, int num_fec_remaining,
|
| } else {
|
| assert(false);
|
| }
|
| -
|
| }
|
|
|
| // Protection for important (first partition) packets
|
| -void ImportantPacketProtection(int num_fec_for_imp_packets, int num_imp_packets,
|
| - int num_mask_bytes, uint8_t* packet_mask,
|
| +void ImportantPacketProtection(int num_fec_for_imp_packets,
|
| + int num_imp_packets,
|
| + int num_mask_bytes,
|
| + uint8_t* packet_mask,
|
| const PacketMaskTable& mask_table) {
|
| const int l_bit = num_imp_packets > 16 ? 1 : 0;
|
| const int num_imp_mask_bytes =
|
| (l_bit == 1) ? kMaskSizeLBitSet : kMaskSizeLBitClear;
|
|
|
| // Get sub_mask1 from table
|
| - const uint8_t* packet_mask_sub_1 = mask_table.fec_packet_mask_table()[
|
| - num_imp_packets - 1][num_fec_for_imp_packets - 1];
|
| + const uint8_t* packet_mask_sub_1 =
|
| + mask_table.fec_packet_mask_table()[num_imp_packets -
|
| + 1][num_fec_for_imp_packets - 1];
|
|
|
| FitSubMask(num_mask_bytes, num_imp_mask_bytes, num_fec_for_imp_packets,
|
| packet_mask_sub_1, packet_mask);
|
| -
|
| }
|
|
|
| // This function sets the protection allocation: i.e., how many FEC packets
|
| // to use for num_imp (1st partition) packets, given the: number of media
|
| // packets, number of FEC packets, and number of 1st partition packets.
|
| -int SetProtectionAllocation(int num_media_packets, int num_fec_packets,
|
| +int SetProtectionAllocation(int num_media_packets,
|
| + int num_fec_packets,
|
| int num_imp_packets) {
|
| -
|
| - // TODO (marpan): test different cases for protection allocation:
|
| + // TODO(marpan): test different cases for protection allocation:
|
|
|
| // Use at most (alloc_par * num_fec_packets) for important packets.
|
| float alloc_par = 0.5;
|
| int max_num_fec_for_imp = alloc_par * num_fec_packets;
|
|
|
| - int num_fec_for_imp_packets =
|
| - (num_imp_packets < max_num_fec_for_imp) ? num_imp_packets
|
| - : max_num_fec_for_imp;
|
| + int num_fec_for_imp_packets = (num_imp_packets < max_num_fec_for_imp)
|
| + ? num_imp_packets
|
| + : max_num_fec_for_imp;
|
|
|
| // Fall back to equal protection in this case
|
| if (num_fec_packets == 1 && (num_media_packets > 2 * num_imp_packets)) {
|
| @@ -268,7 +285,7 @@ int SetProtectionAllocation(int num_media_packets, int num_fec_packets,
|
| // Current version has 3 modes (options) to build UEP mask from existing ones.
|
| // Various other combinations may be added in future versions.
|
| // Longer-term, we may add another set of tables specifically for UEP cases.
|
| -// TODO (marpan): also consider modification of masks for bursty loss cases.
|
| +// TODO(marpan): also consider modification of masks for bursty loss cases.
|
|
|
| // Mask is characterized as (#packets_to_protect, #fec_for_protection).
|
| // Protection factor defined as: (#fec_for_protection / #packets_to_protect).
|
| @@ -306,13 +323,14 @@ int SetProtectionAllocation(int num_media_packets, int num_fec_packets,
|
| // Protection Mode 2 may be extended for a sort of sliding protection
|
| // (i.e., vary the number/density of "1s" across columns) across packets.
|
|
|
| -void UnequalProtectionMask(int num_media_packets, int num_fec_packets,
|
| - int num_imp_packets, int num_mask_bytes,
|
| +void UnequalProtectionMask(int num_media_packets,
|
| + int num_fec_packets,
|
| + int num_imp_packets,
|
| + int num_mask_bytes,
|
| uint8_t* packet_mask,
|
| const PacketMaskTable& mask_table) {
|
| -
|
| // Set Protection type and allocation
|
| - // TODO (marpan): test/update for best mode and some combinations thereof.
|
| + // TODO(marpan): test/update for best mode and some combinations thereof.
|
|
|
| ProtectionMode mode = kModeOverlap;
|
| int num_fec_for_imp_packets = 0;
|
| @@ -341,11 +359,12 @@ void UnequalProtectionMask(int num_media_packets, int num_fec_packets,
|
| num_fec_for_imp_packets, num_mask_bytes, mode,
|
| packet_mask, mask_table);
|
| }
|
| -
|
| }
|
|
|
| -void GeneratePacketMasks(int num_media_packets, int num_fec_packets,
|
| - int num_imp_packets, bool use_unequal_protection,
|
| +void GeneratePacketMasks(int num_media_packets,
|
| + int num_fec_packets,
|
| + int num_imp_packets,
|
| + bool use_unequal_protection,
|
| const PacketMaskTable& mask_table,
|
| uint8_t* packet_mask) {
|
| assert(num_media_packets > 0);
|
| @@ -361,16 +380,15 @@ void GeneratePacketMasks(int num_media_packets, int num_fec_packets,
|
| // Retrieve corresponding mask table directly:for equal-protection case.
|
| // Mask = (k,n-k), with protection factor = (n-k)/k,
|
| // where k = num_media_packets, n=total#packets, (n-k)=num_fec_packets.
|
| - memcpy(packet_mask, mask_table.fec_packet_mask_table()[
|
| - num_media_packets - 1][num_fec_packets - 1],
|
| + memcpy(packet_mask,
|
| + mask_table.fec_packet_mask_table()[num_media_packets -
|
| + 1][num_fec_packets - 1],
|
| num_fec_packets * num_mask_bytes);
|
| - } else //UEP case
|
| - {
|
| + } else { // UEP case
|
| UnequalProtectionMask(num_media_packets, num_fec_packets, num_imp_packets,
|
| num_mask_bytes, packet_mask, mask_table);
|
| -
|
| } // End of UEP modification
|
| -} //End of GetPacketMasks
|
| +} // End of GetPacketMasks
|
|
|
| } // namespace internal
|
| } // namespace webrtc
|
|
|