Fixed base time in TransportFeedback message writing.

Value was incorrectly truncated to 16 bits when serializing the message.
Fixed, with added regression tests.

BUG=

Review URL: https://codereview.webrtc.org/1294393002

Cr-Commit-Position: refs/heads/master@{#9858}
This commit is contained in:
sprang
2015-09-04 04:38:13 -07:00
committed by Commit bot
parent d415629de7
commit c8a1cccd0a
3 changed files with 26 additions and 7 deletions

View File

@ -526,12 +526,8 @@ uint16_t TransportFeedback::GetBaseSequence() const {
return base_seq_;
}
int32_t TransportFeedback::GetBaseTime() const {
return static_cast<int32_t>(base_time_ & 0x00FFFFFF);
}
int64_t TransportFeedback::GetBaseTimeUs() const {
return GetBaseTime() * kBaseScaleFactor;
return base_time_ * kBaseScaleFactor;
}
std::vector<TransportFeedback::StatusSymbol>
@ -591,7 +587,7 @@ bool TransportFeedback::Create(uint8_t* packet,
*position += 2;
ByteWriter<int32_t, 3>::WriteBigEndian(&packet[*position],
static_cast<int16_t>(base_time_));
static_cast<int32_t>(base_time_));
*position += 3;
packet[(*position)++] = feedback_seq_;

View File

@ -43,7 +43,6 @@ class TransportFeedback : public RtcpPacket {
};
uint16_t GetBaseSequence() const;
int32_t GetBaseTime() const;
std::vector<TransportFeedback::StatusSymbol> GetStatusVector() const;
std::vector<int16_t> GetReceiveDeltas() const;

View File

@ -389,6 +389,30 @@ TEST(RtcpPacketTest, TransportFeedback_Limits) {
1, kMaxNegativeTimeDelta - TransportFeedback::kDeltaScaleFactor));
EXPECT_TRUE(packet->WithReceivedPacket(1, kMaxNegativeTimeDelta));
// Base time at maximum value.
int64_t kMaxBaseTime =
static_cast<int64_t>(TransportFeedback::kDeltaScaleFactor) * (1L << 8) *
((1L << 23) - 1);
packet.reset(new TransportFeedback());
packet->WithBase(0, kMaxBaseTime);
packet->WithReceivedPacket(0, kMaxBaseTime);
// Serialize and de-serialize (verify 24bit parsing).
rtc::scoped_ptr<rtcp::RawPacket> raw_packet = packet->Build();
packet =
TransportFeedback::ParseFrom(raw_packet->Buffer(), raw_packet->Length());
EXPECT_EQ(kMaxBaseTime, packet->GetBaseTimeUs());
// Base time above maximum value.
int64_t kTooLargeBaseTime =
kMaxBaseTime + (TransportFeedback::kDeltaScaleFactor * (1L << 8));
packet.reset(new TransportFeedback());
packet->WithBase(0, kTooLargeBaseTime);
packet->WithReceivedPacket(0, kTooLargeBaseTime);
raw_packet = packet->Build();
packet =
TransportFeedback::ParseFrom(raw_packet->Buffer(), raw_packet->Length());
EXPECT_NE(kTooLargeBaseTime, packet->GetBaseTimeUs());
// TODO(sprang): Once we support max length lower than RTCP length limit,
// add back test for max size in bytes.
}