rtcp::Nack packet moved into own file and got Parse function
Review URL: https://codereview.webrtc.org/1461623003 Cr-Commit-Position: refs/heads/master@{#11111}
This commit is contained in:
@ -209,31 +209,6 @@ void CreateSli(const RTCPPacketPSFBSLI& sli,
|
||||
AssignUWord8(buffer, pos, (sli_item.NumberOfMB << 6) + sli_item.PictureId);
|
||||
}
|
||||
|
||||
// Generic NACK (RFC 4585).
|
||||
//
|
||||
// FCI:
|
||||
//
|
||||
// 0 1 2 3
|
||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
// | PID | BLP |
|
||||
// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
||||
|
||||
void CreateNack(const RTCPPacketRTPFBNACK& nack,
|
||||
const std::vector<RTCPPacketRTPFBNACKItem>& nack_fields,
|
||||
size_t start_index,
|
||||
size_t end_index,
|
||||
uint8_t* buffer,
|
||||
size_t* pos) {
|
||||
AssignUWord32(buffer, pos, nack.SenderSSRC);
|
||||
AssignUWord32(buffer, pos, nack.MediaSSRC);
|
||||
for (size_t i = start_index; i < end_index; ++i) {
|
||||
const RTCPPacketRTPFBNACKItem& nack_item = nack_fields[i];
|
||||
AssignUWord16(buffer, pos, nack_item.PacketID);
|
||||
AssignUWord16(buffer, pos, nack_item.BitMask);
|
||||
}
|
||||
}
|
||||
|
||||
// Reference picture selection indication (RPSI) (RFC 4585).
|
||||
//
|
||||
// FCI:
|
||||
@ -597,65 +572,6 @@ bool Sli::Create(uint8_t* packet,
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Nack::Create(uint8_t* packet,
|
||||
size_t* index,
|
||||
size_t max_length,
|
||||
RtcpPacket::PacketReadyCallback* callback) const {
|
||||
assert(!nack_fields_.empty());
|
||||
// If nack list can't fit in packet, try to fragment.
|
||||
size_t nack_index = 0;
|
||||
do {
|
||||
size_t bytes_left_in_buffer = max_length - *index;
|
||||
if (bytes_left_in_buffer < kCommonFbFmtLength + 4) {
|
||||
if (!OnBufferFull(packet, index, callback))
|
||||
return false;
|
||||
continue;
|
||||
}
|
||||
int64_t num_nack_fields =
|
||||
std::min((bytes_left_in_buffer - kCommonFbFmtLength) / 4,
|
||||
nack_fields_.size() - nack_index);
|
||||
|
||||
const uint8_t kFmt = 1;
|
||||
size_t size_bytes = (num_nack_fields * 4) + kCommonFbFmtLength;
|
||||
size_t header_length = ((size_bytes + 3) / 4) - 1; // As 32bit words - 1
|
||||
CreateHeader(kFmt, PT_RTPFB, header_length, packet, index);
|
||||
CreateNack(nack_, nack_fields_, nack_index, nack_index + num_nack_fields,
|
||||
packet, index);
|
||||
|
||||
nack_index += num_nack_fields;
|
||||
} while (nack_index < nack_fields_.size());
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
size_t Nack::BlockLength() const {
|
||||
return (nack_fields_.size() * 4) + kCommonFbFmtLength;
|
||||
}
|
||||
|
||||
void Nack::WithList(const uint16_t* nack_list, int length) {
|
||||
assert(nack_list);
|
||||
assert(nack_fields_.empty());
|
||||
int i = 0;
|
||||
while (i < length) {
|
||||
uint16_t pid = nack_list[i++];
|
||||
// Bitmask specifies losses in any of the 16 packets following the pid.
|
||||
uint16_t bitmask = 0;
|
||||
while (i < length) {
|
||||
int shift = static_cast<uint16_t>(nack_list[i] - pid) - 1;
|
||||
if (shift >= 0 && shift <= 15) {
|
||||
bitmask |= (1 << shift);
|
||||
++i;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
RTCPUtility::RTCPPacketRTPFBNACKItem item;
|
||||
item.PacketID = pid;
|
||||
item.BitMask = bitmask;
|
||||
nack_fields_.push_back(item);
|
||||
}
|
||||
}
|
||||
|
||||
bool Rpsi::Create(uint8_t* packet,
|
||||
size_t* index,
|
||||
size_t max_length,
|
||||
|
||||
Reference in New Issue
Block a user