OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" | 10 #include "webrtc/modules/rtp_rtcp/source/rtp_packet_received.h" |
(...skipping 14 matching lines...) Expand all Loading... |
25 constexpr int8_t kPayloadType = 100; | 25 constexpr int8_t kPayloadType = 100; |
26 constexpr uint32_t kSsrc = 0x12345678; | 26 constexpr uint32_t kSsrc = 0x12345678; |
27 constexpr uint16_t kSeqNum = 0x1234; | 27 constexpr uint16_t kSeqNum = 0x1234; |
28 constexpr uint8_t kSeqNumFirstByte = kSeqNum >> 8; | 28 constexpr uint8_t kSeqNumFirstByte = kSeqNum >> 8; |
29 constexpr uint8_t kSeqNumSecondByte = kSeqNum & 0xff; | 29 constexpr uint8_t kSeqNumSecondByte = kSeqNum & 0xff; |
30 constexpr uint32_t kTimestamp = 0x65431278; | 30 constexpr uint32_t kTimestamp = 0x65431278; |
31 constexpr uint8_t kTransmissionOffsetExtensionId = 1; | 31 constexpr uint8_t kTransmissionOffsetExtensionId = 1; |
32 constexpr uint8_t kAudioLevelExtensionId = 9; | 32 constexpr uint8_t kAudioLevelExtensionId = 9; |
33 constexpr uint8_t kRtpStreamIdExtensionId = 0xa; | 33 constexpr uint8_t kRtpStreamIdExtensionId = 0xa; |
34 constexpr uint8_t kRtpMidExtensionId = 0xb; | 34 constexpr uint8_t kRtpMidExtensionId = 0xb; |
| 35 constexpr uint8_t kVideoTimingExtensionId = 0xc; |
35 constexpr int32_t kTimeOffset = 0x56ce; | 36 constexpr int32_t kTimeOffset = 0x56ce; |
36 constexpr bool kVoiceActive = true; | 37 constexpr bool kVoiceActive = true; |
37 constexpr uint8_t kAudioLevel = 0x5a; | 38 constexpr uint8_t kAudioLevel = 0x5a; |
38 constexpr char kStreamId[] = "streamid"; | 39 constexpr char kStreamId[] = "streamid"; |
39 constexpr char kMid[] = "mid"; | 40 constexpr char kMid[] = "mid"; |
40 constexpr size_t kMaxPaddingSize = 224u; | 41 constexpr size_t kMaxPaddingSize = 224u; |
41 // clang-format off | 42 // clang-format off |
42 constexpr uint8_t kMinimumPacket[] = { | 43 constexpr uint8_t kMinimumPacket[] = { |
43 0x80, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, | 44 0x80, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, |
44 0x65, 0x43, 0x12, 0x78, | 45 0x65, 0x43, 0x12, 0x78, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 'p', 'a', 'd', 'd', 'i', 'n', 'g', kPacketPaddingSize}; | 91 'p', 'a', 'd', 'd', 'i', 'n', 'g', kPacketPaddingSize}; |
91 | 92 |
92 constexpr uint8_t kPacketWithInvalidExtension[] = { | 93 constexpr uint8_t kPacketWithInvalidExtension[] = { |
93 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, | 94 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, |
94 0x65, 0x43, 0x12, 0x78, // kTimestamp. | 95 0x65, 0x43, 0x12, 0x78, // kTimestamp. |
95 0x12, 0x34, 0x56, 0x78, // kSSrc. | 96 0x12, 0x34, 0x56, 0x78, // kSSrc. |
96 0xbe, 0xde, 0x00, 0x02, // Extension block of size 2 x 32bit words. | 97 0xbe, 0xde, 0x00, 0x02, // Extension block of size 2 x 32bit words. |
97 (kTransmissionOffsetExtensionId << 4) | 6, // (6+1)-byte extension, but | 98 (kTransmissionOffsetExtensionId << 4) | 6, // (6+1)-byte extension, but |
98 'e', 'x', 't', // Transmission Offset | 99 'e', 'x', 't', // Transmission Offset |
99 'd', 'a', 't', 'a', // expected to be 3-bytes. | 100 'd', 'a', 't', 'a', // expected to be 3-bytes. |
100 'p', 'a', 'y', 'l', 'o', 'a', 'd' | 101 'p', 'a', 'y', 'l', 'o', 'a', 'd'}; |
101 }; | 102 |
| 103 constexpr uint8_t kPacketWithLegacyTimingExtension[] = { |
| 104 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, |
| 105 0x65, 0x43, 0x12, 0x78, // kTimestamp. |
| 106 0x12, 0x34, 0x56, 0x78, // kSSrc. |
| 107 0xbe, 0xde, 0x00, 0x04, // Extension block of size 4 x 32bit words. |
| 108 (kVideoTimingExtensionId << 4) |
| 109 | VideoTimingExtension::kValueSizeBytes - 2, // Old format without flags. |
| 110 0x00, 0x01, 0x00, |
| 111 0x02, 0x00, 0x03, 0x00, |
| 112 0x04, 0x00, 0x00, 0x00, |
| 113 0x00, 0x00, 0x00, 0x00}; |
102 // clang-format on | 114 // clang-format on |
103 } // namespace | 115 } // namespace |
104 | 116 |
105 TEST(RtpPacketTest, CreateMinimum) { | 117 TEST(RtpPacketTest, CreateMinimum) { |
106 RtpPacketToSend packet(nullptr); | 118 RtpPacketToSend packet(nullptr); |
107 packet.SetPayloadType(kPayloadType); | 119 packet.SetPayloadType(kPayloadType); |
108 packet.SetSequenceNumber(kSeqNum); | 120 packet.SetSequenceNumber(kSeqNum); |
109 packet.SetTimestamp(kTimestamp); | 121 packet.SetTimestamp(kTimestamp); |
110 packet.SetSsrc(kSsrc); | 122 packet.SetSsrc(kSsrc); |
111 EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size())); | 123 EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size())); |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
491 | 503 |
492 ASSERT_TRUE(packet.Parse(kPacket, sizeof(kPacket))); | 504 ASSERT_TRUE(packet.Parse(kPacket, sizeof(kPacket))); |
493 | 505 |
494 EXPECT_FALSE(packet.HasRawExtension(kInvalidId)); | 506 EXPECT_FALSE(packet.HasRawExtension(kInvalidId)); |
495 EXPECT_THAT(packet.GetRawExtension(kInvalidId), IsEmpty()); | 507 EXPECT_THAT(packet.GetRawExtension(kInvalidId), IsEmpty()); |
496 const uint8_t kExtension[] = {'e', 'x', 't'}; | 508 const uint8_t kExtension[] = {'e', 'x', 't'}; |
497 EXPECT_FALSE(packet.SetRawExtension(kInvalidId, kExtension)); | 509 EXPECT_FALSE(packet.SetRawExtension(kInvalidId, kExtension)); |
498 EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty()); | 510 EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty()); |
499 } | 511 } |
500 | 512 |
| 513 TEST(RtpPacketTest, CreateAndParseTimingFrameExtension) { |
| 514 // Create a packet with video frame timing extension populated. |
| 515 RtpPacketToSend::ExtensionManager send_extensions; |
| 516 send_extensions.Register(kRtpExtensionVideoTiming, kVideoTimingExtensionId); |
| 517 RtpPacketToSend send_packet(&send_extensions); |
| 518 send_packet.SetPayloadType(kPayloadType); |
| 519 send_packet.SetSequenceNumber(kSeqNum); |
| 520 send_packet.SetTimestamp(kTimestamp); |
| 521 send_packet.SetSsrc(kSsrc); |
| 522 |
| 523 VideoSendTiming timing; |
| 524 timing.encode_start_delta_ms = 1; |
| 525 timing.encode_finish_delta_ms = 2; |
| 526 timing.packetization_finish_delta_ms = 3; |
| 527 timing.pacer_exit_delta_ms = 4; |
| 528 timing.flags = |
| 529 TimingFrameFlags::kTriggeredByTimer + TimingFrameFlags::kTriggeredBySize; |
| 530 |
| 531 send_packet.SetExtension<VideoTimingExtension>(timing); |
| 532 |
| 533 // Serialize the packet and then parse it again. |
| 534 RtpPacketReceived::ExtensionManager extensions; |
| 535 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId); |
| 536 RtpPacketReceived receive_packet(&extensions); |
| 537 EXPECT_TRUE(receive_packet.Parse(send_packet.Buffer())); |
| 538 |
| 539 VideoSendTiming receivied_timing; |
| 540 EXPECT_TRUE( |
| 541 receive_packet.GetExtension<VideoTimingExtension>(&receivied_timing)); |
| 542 |
| 543 // Only check first and last timestamp (covered by other tests) plus flags. |
| 544 EXPECT_EQ(receivied_timing.encode_start_delta_ms, |
| 545 timing.encode_start_delta_ms); |
| 546 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, timing.pacer_exit_delta_ms); |
| 547 EXPECT_EQ(receivied_timing.flags, timing.flags); |
| 548 } |
| 549 |
| 550 TEST(RtpPacketTest, ParseLegacyTimingFrameExtension) { |
| 551 // Parse the modified packet. |
| 552 RtpPacketReceived::ExtensionManager extensions; |
| 553 extensions.Register<VideoTimingExtension>(kVideoTimingExtensionId); |
| 554 RtpPacketReceived packet(&extensions); |
| 555 EXPECT_TRUE(packet.Parse(kPacketWithLegacyTimingExtension, |
| 556 sizeof(kPacketWithLegacyTimingExtension))); |
| 557 VideoSendTiming receivied_timing; |
| 558 EXPECT_TRUE(packet.GetExtension<VideoTimingExtension>(&receivied_timing)); |
| 559 |
| 560 // Check first and last timestamp are still OK. Flags should now be 0. |
| 561 EXPECT_EQ(receivied_timing.encode_start_delta_ms, 1); |
| 562 EXPECT_EQ(receivied_timing.pacer_exit_delta_ms, 4); |
| 563 EXPECT_EQ(receivied_timing.flags, 0); |
| 564 } |
| 565 |
501 } // namespace webrtc | 566 } // namespace webrtc |
OLD | NEW |