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:
parent
5f28498149
commit
d2e6779565
@ -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.
|
||||||
|
@ -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: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user