| 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
|
|
|