Fixes for selective NACKing.

BUG=
TEST=

Review URL: http://webrtc-codereview.appspot.com/332007

git-svn-id: http://webrtc.googlecode.com/svn/trunk@1243 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
stefan@webrtc.org 2011-12-20 09:12:50 +00:00
parent fda17c2b00
commit 8dc9e4760e
2 changed files with 48 additions and 9 deletions

View File

@ -399,10 +399,12 @@ int VCMSessionInfo::ZeroOutSeqNumHybrid(int* seq_num_list,
} }
int index = 0; int index = 0;
// Find entrance point (index of entry equals the sequence number of the first int low_seq_num = (packets_.empty()) ? empty_seq_num_low_:
// packet). packets_.front().seqNum;
// Find entrance point (index of entry equals the sequence number of the
// first packet).
for (; index < seq_num_list_length; ++index) { for (; index < seq_num_list_length; ++index) {
if (seq_num_list[index] == packets_.front().seqNum) { if (seq_num_list[index] == low_seq_num) {
seq_num_list[index] = -1; seq_num_list[index] = -1;
break; break;
} }
@ -422,13 +424,19 @@ int VCMSessionInfo::ZeroOutSeqNumHybrid(int* seq_num_list,
// Zero out between first entry and end point. // Zero out between first entry and end point.
WebRtc_Word32 media_high_seq_num; int media_high_seq_num;
if (HaveLastPacket()) { if (HaveLastPacket()) {
media_high_seq_num = packets_.back().seqNum; media_high_seq_num = packets_.back().seqNum;
} else { } else {
// Estimation. // Estimation.
media_high_seq_num = empty_seq_num_low_ - 1 > packets_.back().seqNum ? if (empty_seq_num_low_ >= 0) {
empty_seq_num_low_ - 1: packets_.back().seqNum; // Assuming empty packets have later sequence numbers than media packets.
media_high_seq_num = empty_seq_num_low_ - 1;
} else {
// Since this frame doesn't have the marker bit we can assume it should
// contain at least one more packet.
media_high_seq_num = static_cast<uint16_t>(packets_.back().seqNum + 1);
}
} }
// Compute session/packet scores and thresholds: // Compute session/packet scores and thresholds:
@ -561,7 +569,6 @@ int VCMSessionInfo::InsertPacket(const VCMPacket& packet,
return returnLength; return returnLength;
} }
void VCMSessionInfo::InformOfEmptyPacket(uint16_t seq_num) { void VCMSessionInfo::InformOfEmptyPacket(uint16_t seq_num) {
// Empty packets may be FEC or filler packets. They are sequential and // Empty packets may be FEC or filler packets. They are sequential and
// follow the data packets, therefore, we should only keep track of the high // follow the data packets, therefore, we should only keep track of the high
@ -569,7 +576,8 @@ void VCMSessionInfo::InformOfEmptyPacket(uint16_t seq_num) {
// empty packets belonging to the same frame (timestamp). // empty packets belonging to the same frame (timestamp).
empty_seq_num_high_ = LatestSequenceNumber(seq_num, empty_seq_num_high_, empty_seq_num_high_ = LatestSequenceNumber(seq_num, empty_seq_num_high_,
NULL); NULL);
if (LatestSequenceNumber(seq_num, empty_seq_num_low_, NULL) == if (empty_seq_num_low_ == -1 ||
LatestSequenceNumber(seq_num, empty_seq_num_low_, NULL) ==
empty_seq_num_low_) empty_seq_num_low_)
empty_seq_num_low_ = seq_num; empty_seq_num_low_ = seq_num;
} }

View File

@ -889,6 +889,37 @@ TEST_F(TestZeroOutSeqNum, FirstAndLastLost) {
EXPECT_EQ(1, seq_num_list_[2]); EXPECT_EQ(1, seq_num_list_[2]);
} }
TEST_F(TestZeroOutSeqNum, LostAllButEmptyPackets) {
uint16_t low = 0;
packet_.seqNum = low + 1;
packet_.isFirstPacket = false;
packet_.markerBit = false;
packet_.frameType = kFrameEmpty;
packet_.sizeBytes = 0;
FillPacket(0);
ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0), 0);
packet_.seqNum = low + 3;
packet_.isFirstPacket = false;
packet_.markerBit = false;
packet_.frameType = kFrameEmpty;
packet_.sizeBytes = 0;
FillPacket(0);
ASSERT_EQ(session_.InsertPacket(packet_, frame_buffer_, false, 0), 0);
EXPECT_EQ(0, session_.SessionLength());
BuildSeqNumList(low, packet_.seqNum + 1);
EXPECT_EQ(0, session_.ZeroOutSeqNumHybrid(seq_num_list_,
seq_num_list_length_,
60));
EXPECT_EQ(true, session_.session_nack());
EXPECT_EQ(0, seq_num_list_[0]);
EXPECT_EQ(-1, seq_num_list_[1]);
EXPECT_EQ(-2, seq_num_list_[2]);
EXPECT_EQ(-2, seq_num_list_[3]);
EXPECT_EQ(4, seq_num_list_[4]);
}
TEST_F(TestSessionInfo, PacketPriorBitsPacketLost) { TEST_F(TestSessionInfo, PacketPriorBitsPacketLost) {
packet_.seqNum = 0; packet_.seqNum = 0;
packet_.codecSpecificHeader.codec = kRTPVideoH263; packet_.codecSpecificHeader.codec = kRTPVideoH263;