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..776db53385e30a04c49cbb1d03a35b5fed1d5ed3 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; |
@@ -97,8 +98,19 @@ constexpr uint8_t kPacketWithInvalidExtension[] = { |
(kTransmissionOffsetExtensionId << 4) | 6, // (6+1)-byte extension, but |
'e', 'x', 't', // Transmission Offset |
'd', 'a', 't', 'a', // expected to be 3-bytes. |
- 'p', 'a', 'y', 'l', 'o', 'a', 'd' |
-}; |
+ 'p', 'a', 'y', 'l', 'o', 'a', 'd'}; |
+ |
+constexpr uint8_t kPacketWithLegacyTimingExtension[] = { |
+ 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, |
+ 0x65, 0x43, 0x12, 0x78, // kTimestamp. |
+ 0x12, 0x34, 0x56, 0x78, // kSSrc. |
+ 0xbe, 0xde, 0x00, 0x04, // Extension block of size 4 x 32bit words. |
+ (kVideoTimingExtensionId << 4) |
+ | VideoTimingExtension::kValueSizeBytes - 2, // Old format without flags. |
+ 0x00, 0x01, 0x00, |
+ 0x02, 0x00, 0x03, 0x00, |
+ 0x04, 0x00, 0x00, 0x00, |
+ 0x00, 0x00, 0x00, 0x00}; |
// clang-format on |
} // namespace |
@@ -498,4 +510,57 @@ TEST(RtpPacketTest, RawExtensionFunctionsAcceptZeroIdAndReturnFalse) { |
EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty()); |
} |
+TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) { |
+ // 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.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); |
+ EXPECT_TRUE(receive_packet.Parse(send_packet.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.pacer_exit_delta_ms, timing.pacer_exit_delta_ms); |
+ EXPECT_EQ(receivied_timing.flags, timing.flags); |
+} |
+ |
+TEST(RtpPacketTest, ParseLegacyTimingFrameExtension) { |
+ // Parse the modified packet. |
+ RtpPacketReceived::ExtensionManager extensions; |
+ extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId); |
+ RtpPacketReceived packet(&extensions); |
+ EXPECT_TRUE(packet.Parse(kPacketWithLegacyTimingExtension, |
+ sizeof(kPacketWithLegacyTimingExtension))); |
+ VideoSendTiming receivied_timing; |
+ EXPECT_TRUE(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, 1); |
+ EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, 4); |
+ EXPECT_EQ(receivied_timing.flags, 0); |
+} |
+ |
} // namespace webrtc |