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; | |
36 constexpr int32_t kTimeOffset = 0x56ce; | 35 constexpr int32_t kTimeOffset = 0x56ce; |
37 constexpr bool kVoiceActive = true; | 36 constexpr bool kVoiceActive = true; |
38 constexpr uint8_t kAudioLevel = 0x5a; | 37 constexpr uint8_t kAudioLevel = 0x5a; |
39 constexpr char kStreamId[] = "streamid"; | 38 constexpr char kStreamId[] = "streamid"; |
40 constexpr char kMid[] = "mid"; | 39 constexpr char kMid[] = "mid"; |
41 constexpr size_t kMaxPaddingSize = 224u; | 40 constexpr size_t kMaxPaddingSize = 224u; |
42 // clang-format off | 41 // clang-format off |
43 constexpr uint8_t kMinimumPacket[] = { | 42 constexpr uint8_t kMinimumPacket[] = { |
44 0x80, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, | 43 0x80, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, |
45 0x65, 0x43, 0x12, 0x78, | 44 0x65, 0x43, 0x12, 0x78, |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
91 'p', 'a', 'd', 'd', 'i', 'n', 'g', kPacketPaddingSize}; | 90 'p', 'a', 'd', 'd', 'i', 'n', 'g', kPacketPaddingSize}; |
92 | 91 |
93 constexpr uint8_t kPacketWithInvalidExtension[] = { | 92 constexpr uint8_t kPacketWithInvalidExtension[] = { |
94 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, | 93 0x90, kPayloadType, kSeqNumFirstByte, kSeqNumSecondByte, |
95 0x65, 0x43, 0x12, 0x78, // kTimestamp. | 94 0x65, 0x43, 0x12, 0x78, // kTimestamp. |
96 0x12, 0x34, 0x56, 0x78, // kSSrc. | 95 0x12, 0x34, 0x56, 0x78, // kSSrc. |
97 0xbe, 0xde, 0x00, 0x02, // Extension block of size 2 x 32bit words. | 96 0xbe, 0xde, 0x00, 0x02, // Extension block of size 2 x 32bit words. |
98 (kTransmissionOffsetExtensionId << 4) | 6, // (6+1)-byte extension, but | 97 (kTransmissionOffsetExtensionId << 4) | 6, // (6+1)-byte extension, but |
99 'e', 'x', 't', // Transmission Offset | 98 'e', 'x', 't', // Transmission Offset |
100 'd', 'a', 't', 'a', // expected to be 3-bytes. | 99 'd', 'a', 't', 'a', // expected to be 3-bytes. |
101 'p', 'a', 'y', 'l', 'o', 'a', 'd'}; | 100 'p', 'a', 'y', 'l', 'o', 'a', 'd' |
102 | 101 }; |
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}; | |
114 // clang-format on | 102 // clang-format on |
115 } // namespace | 103 } // namespace |
116 | 104 |
117 TEST(RtpPacketTest, CreateMinimum) { | 105 TEST(RtpPacketTest, CreateMinimum) { |
118 RtpPacketToSend packet(nullptr); | 106 RtpPacketToSend packet(nullptr); |
119 packet.SetPayloadType(kPayloadType); | 107 packet.SetPayloadType(kPayloadType); |
120 packet.SetSequenceNumber(kSeqNum); | 108 packet.SetSequenceNumber(kSeqNum); |
121 packet.SetTimestamp(kTimestamp); | 109 packet.SetTimestamp(kTimestamp); |
122 packet.SetSsrc(kSsrc); | 110 packet.SetSsrc(kSsrc); |
123 EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size())); | 111 EXPECT_THAT(kMinimumPacket, ElementsAreArray(packet.data(), packet.size())); |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
503 | 491 |
504 ASSERT_TRUE(packet.Parse(kPacket, sizeof(kPacket))); | 492 ASSERT_TRUE(packet.Parse(kPacket, sizeof(kPacket))); |
505 | 493 |
506 EXPECT_FALSE(packet.HasRawExtension(kInvalidId)); | 494 EXPECT_FALSE(packet.HasRawExtension(kInvalidId)); |
507 EXPECT_THAT(packet.GetRawExtension(kInvalidId), IsEmpty()); | 495 EXPECT_THAT(packet.GetRawExtension(kInvalidId), IsEmpty()); |
508 const uint8_t kExtension[] = {'e', 'x', 't'}; | 496 const uint8_t kExtension[] = {'e', 'x', 't'}; |
509 EXPECT_FALSE(packet.SetRawExtension(kInvalidId, kExtension)); | 497 EXPECT_FALSE(packet.SetRawExtension(kInvalidId, kExtension)); |
510 EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty()); | 498 EXPECT_THAT(packet.AllocateRawExtension(kInvalidId, 3), IsEmpty()); |
511 } | 499 } |
512 | 500 |
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 | |
566 } // namespace webrtc | 501 } // namespace webrtc |
OLD | NEW |