Chromium Code Reviews| Index: webrtc/modules/rtp_rtcp/source/rtp_packet_unittest.cc |
| diff --git a/webrtc/modules/rtp_rtcp/source/rtp_packet_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_packet_unittest.cc |
| index 1075d9ea352bbdd487eb808f328f56865e2d4a1a..257f626293c5156d9ecb636c46a01e5f47a12c73 100644 |
| --- a/webrtc/modules/rtp_rtcp/source/rtp_packet_unittest.cc |
| +++ b/webrtc/modules/rtp_rtcp/source/rtp_packet_unittest.cc |
| @@ -32,6 +32,7 @@ constexpr uint8_t kTransmissionOffsetExtensionId = 1; |
| constexpr uint8_t kAudioLevelExtensionId = 9; |
| constexpr uint8_t kRtpStreamIdExtensionId = 0xa; |
| constexpr uint8_t kRtpMidExtensionId = 0xb; |
| +constexpr uint8_t kVideoTimingExtensionId = 0xc; |
| constexpr int32_t kTimeOffset = 0x56ce; |
| constexpr bool kVoiceActive = true; |
| constexpr uint8_t kAudioLevel = 0x5a; |
| @@ -498,4 +499,71 @@ TEST(RtpPacketTest, RawExtensionFunctionsAcceptZeroIdAndReturnFalse) { |
| EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty()); |
| } |
| +TEST(RtpPacketTest, TimingFrameExtension) { |
|
danilchap
2017/08/11 12:22:36
Prefer to split this test into 2-3 smaller tests:
sprang_webrtc
2017/08/11 13:19:05
Done.
|
| + // Create a packet with video frame timing extension populated. |
| + RtpPacketToSend::ExtensionManager send_extensions; |
| + send_extensions.Register(kRtpExtensionVideoTiming, kVideoTimingExtensionId); |
| + RtpPacketToSend send_packet(&send_extensions); |
| + send_packet.SetPayloadType(kPayloadType); |
| + send_packet.SetSequenceNumber(kSeqNum); |
| + send_packet.SetTimestamp(kTimestamp); |
| + send_packet.SetSsrc(kSsrc); |
| + |
| + VideoSendTiming timing; |
| + timing.encode_start_delta_ms = 1; |
| + timing.encode_finish_delta_ms = 2; |
| + timing.packetization_finish_delta_ms = 3; |
| + timing.pacer_exit_delta_ms = 4; |
| + timing.packetization_finish_delta_ms = 5; |
| + timing.flags = |
| + TimingFrameFlags::kTriggeredByTimer + TimingFrameFlags::kTriggeredBySize; |
| + |
| + send_packet.SetExtension<VideoTimingExtension>(timing); |
| + |
| + // Serialize the packet and then parse it again. |
| + RtpPacketReceived::ExtensionManager extensions; |
| + extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId); |
| + RtpPacketReceived receive_packet(&extensions); |
| + rtc::CopyOnWriteBuffer buffer = send_packet.Buffer(); |
| + EXPECT_TRUE(receive_packet.Parse(buffer)); |
| + |
| + VideoSendTiming receivied_timing; |
| + EXPECT_TRUE( |
| + receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing)); |
| + |
| + // Only check first and last timestamp (covered by other tests) plus flags. |
| + EXPECT_EQ(receivied_timing.encode_start_delta_ms, |
| + timing.encode_start_delta_ms); |
| + EXPECT_EQ(receivied_timing.packetization_finish_delta_ms, |
| + timing.packetization_finish_delta_ms); |
| + EXPECT_EQ(receivied_timing.flags, timing.flags); |
| + |
| + // Modify the sent packet so that the old VideoTimingExtension format is used. |
| + rtc::ArrayView<const uint8_t> raw_extension = |
| + receive_packet.GetRawExtension(kVideoTimingExtensionId); |
| + ptrdiff_t start_offset = raw_extension.cbegin() - buffer.cdata(); |
| + const uint8_t kExtensionLength = VideoTimingExtension::kValueSizeBytes; |
| + |
| + // Turn last byte of header extension into padding. |
| + buffer[start_offset + kExtensionLength - 1] = 0; |
| + // Validate one-byte header and reduce length by one. |
| + const uint8_t onebyte_header = buffer[start_offset - 1]; |
| + EXPECT_EQ(onebyte_header, |
| + (kVideoTimingExtensionId << 4) | (kExtensionLength - 1)); |
| + buffer[receive_packet.headers_size() - kExtensionLength] = |
| + (kVideoTimingExtensionId << 4) | (kExtensionLength - 2); |
| + |
| + // Parse the modified packet. |
| + EXPECT_TRUE(receive_packet.Parse(buffer)); |
| + EXPECT_TRUE( |
| + receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing)); |
| + |
| + // Check first and last timestamp are still OK. Flags should now be 0. |
| + EXPECT_EQ(receivied_timing.encode_start_delta_ms, |
| + timing.encode_start_delta_ms); |
| + EXPECT_EQ(receivied_timing.packetization_finish_delta_ms, |
| + timing.packetization_finish_delta_ms); |
| + EXPECT_EQ(receivied_timing.flags, 0); |
| +} |
| + |
| } // namespace webrtc |