Fix for negative transmission time offset.

Review URL: https://webrtc-codereview.appspot.com/671006

git-svn-id: http://webrtc.googlecode.com/svn/trunk@2456 4adac7df-926f-26a2-2b94-8c16560cd09d
This commit is contained in:
asapersson@webrtc.org 2012-06-28 07:53:15 +00:00
parent 5f28498149
commit d2e6779565
2 changed files with 40 additions and 10 deletions

View File

@ -124,21 +124,21 @@ TEST_F(RtpSenderTest, BuildRTPPacket) {
EXPECT_EQ(12, length); EXPECT_EQ(12, length);
// Verify // Verify
webrtc::ModuleRTPUtility::RTPHeaderParser rtpParser(packet_, length); webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
webrtc::WebRtcRTPHeader rtp_header; webrtc::WebRtcRTPHeader rtp_header;
RtpHeaderExtensionMap map; RtpHeaderExtensionMap map;
map.Register(kType, kId); map.Register(kType, kId);
const bool valid_rtp_header = rtpParser.Parse(rtp_header, &map); const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
ASSERT_TRUE(valid_rtp_header); ASSERT_TRUE(valid_rtp_header);
ASSERT_FALSE(rtpParser.RTCP()); ASSERT_FALSE(rtp_parser.RTCP());
VerifyRTPHeaderCommon(rtp_header); VerifyRTPHeaderCommon(rtp_header);
EXPECT_EQ(length, rtp_header.header.headerLength); EXPECT_EQ(length, rtp_header.header.headerLength);
EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset); EXPECT_EQ(0, rtp_header.extension.transmissionTimeOffset);
} }
TEST_F(RtpSenderTest, BuildRTPPacketWithExtension) { TEST_F(RtpSenderTest, BuildRTPPacketWithTransmissionOffsetExtension) {
EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset)); EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kTimeOffset));
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kType, kId)); EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kType, kId));
@ -149,22 +149,22 @@ TEST_F(RtpSenderTest, BuildRTPPacketWithExtension) {
EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length); EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
// Verify // Verify
webrtc::ModuleRTPUtility::RTPHeaderParser rtpParser(packet_, length); webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
webrtc::WebRtcRTPHeader rtp_header; webrtc::WebRtcRTPHeader rtp_header;
RtpHeaderExtensionMap map; RtpHeaderExtensionMap map;
map.Register(kType, kId); map.Register(kType, kId);
const bool valid_rtp_header = rtpParser.Parse(rtp_header, &map); const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
ASSERT_TRUE(valid_rtp_header); ASSERT_TRUE(valid_rtp_header);
ASSERT_FALSE(rtpParser.RTCP()); ASSERT_FALSE(rtp_parser.RTCP());
VerifyRTPHeaderCommon(rtp_header); VerifyRTPHeaderCommon(rtp_header);
EXPECT_EQ(length, rtp_header.header.headerLength); EXPECT_EQ(length, rtp_header.header.headerLength);
EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset); EXPECT_EQ(kTimeOffset, rtp_header.extension.transmissionTimeOffset);
// Parse without map extension // Parse without map extension
webrtc::WebRtcRTPHeader rtp_header2; webrtc::WebRtcRTPHeader rtp_header2;
const bool valid_rtp_header2 = rtpParser.Parse(rtp_header2, NULL); const bool valid_rtp_header2 = rtp_parser.Parse(rtp_header2, NULL);
ASSERT_TRUE(valid_rtp_header2); ASSERT_TRUE(valid_rtp_header2);
VerifyRTPHeaderCommon(rtp_header2); VerifyRTPHeaderCommon(rtp_header2);
@ -172,6 +172,32 @@ TEST_F(RtpSenderTest, BuildRTPPacketWithExtension) {
EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset); EXPECT_EQ(0, rtp_header2.extension.transmissionTimeOffset);
} }
TEST_F(RtpSenderTest, BuildRTPPacketWithNegativeTransmissionOffsetExtension) {
const int kNegTimeOffset = -500;
EXPECT_EQ(0, rtp_sender_->SetTransmissionTimeOffset(kNegTimeOffset));
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension(kType, kId));
WebRtc_Word32 length = rtp_sender_->BuildRTPheader(packet_,
kPayload,
kMarkerBit,
kTimestamp);
EXPECT_EQ(12 + rtp_sender_->RtpHeaderExtensionTotalLength(), length);
// Verify
webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(packet_, length);
webrtc::WebRtcRTPHeader rtp_header;
RtpHeaderExtensionMap map;
map.Register(kType, kId);
const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
ASSERT_TRUE(valid_rtp_header);
ASSERT_FALSE(rtp_parser.RTCP());
VerifyRTPHeaderCommon(rtp_header);
EXPECT_EQ(length, rtp_header.header.headerLength);
EXPECT_EQ(kNegTimeOffset, rtp_header.extension.transmissionTimeOffset);
}
TEST_F(RtpSenderTest, NoTrafficSmoothing) { TEST_F(RtpSenderTest, NoTrafficSmoothing) {
EXPECT_EQ(0, rtp_sender_->RegisterSendTransport(&transport_)); EXPECT_EQ(0, rtp_sender_->RegisterSendTransport(&transport_));
@ -212,13 +238,13 @@ TEST_F(RtpSenderTest, TrafficSmoothing) {
EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_); EXPECT_EQ(rtp_length, transport_.last_sent_packet_len_);
// Parse sent packet. // Parse sent packet.
webrtc::ModuleRTPUtility::RTPHeaderParser rtpParser( webrtc::ModuleRTPUtility::RTPHeaderParser rtp_parser(
transport_.last_sent_packet_, rtp_length); transport_.last_sent_packet_, rtp_length);
webrtc::WebRtcRTPHeader rtp_header; webrtc::WebRtcRTPHeader rtp_header;
RtpHeaderExtensionMap map; RtpHeaderExtensionMap map;
map.Register(kType, kId); map.Register(kType, kId);
const bool valid_rtp_header = rtpParser.Parse(rtp_header, &map); const bool valid_rtp_header = rtp_parser.Parse(rtp_header, &map);
ASSERT_TRUE(valid_rtp_header); ASSERT_TRUE(valid_rtp_header);
// Verify transmission time offset. // Verify transmission time offset.

View File

@ -658,6 +658,10 @@ void RTPHeaderParser::ParseOneByteExtensionHeader(
transmissionTimeOffset += *ptr++ << 8; transmissionTimeOffset += *ptr++ << 8;
transmissionTimeOffset += *ptr++; transmissionTimeOffset += *ptr++;
parsedPacket.extension.transmissionTimeOffset = transmissionTimeOffset; parsedPacket.extension.transmissionTimeOffset = transmissionTimeOffset;
if (transmissionTimeOffset & 0x800000) {
// Negative offset, correct sign for Word24 to Word32.
parsedPacket.extension.transmissionTimeOffset |= 0xFF000000;
}
break; break;
} }
case kRtpExtensionAudioLevel: { case kRtpExtensionAudioLevel: {