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