| /* |
| * Copyright (c) 2024 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #include <cstdint> |
| #include <optional> |
| |
| #include "modules/rtp_rtcp/include/rtp_header_extension_map.h" |
| #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
| #include "modules/rtp_rtcp/source/rtp_header_extensions.h" |
| #include "modules/rtp_rtcp/source/rtp_packet_to_send.h" |
| #include "test/gmock.h" |
| #include "test/gtest.h" |
| |
| namespace webrtc { |
| namespace { |
| |
| RtpPacketToSend BuildPacket(RtpPacketMediaType type) { |
| RtpHeaderExtensionMap extension_manager; |
| RtpPacketToSend packet(&extension_manager); |
| |
| packet.SetSsrc(1); |
| packet.SetSequenceNumber(89); |
| if (type == RtpPacketMediaType::kRetransmission) { |
| packet.set_original_ssrc(2); |
| packet.set_retransmitted_sequence_number(678); |
| } |
| packet.set_transport_sequence_number(0xFFFFFFFF01); |
| packet.SetTimestamp(123); |
| packet.SetPayloadSize(5); |
| packet.set_packet_type(type); |
| return packet; |
| } |
| |
| void VerifyDefaultProperties(const RtpPacketSendInfo& send_info, |
| const RtpPacketToSend& packet, |
| const PacedPacketInfo& paced_info) { |
| EXPECT_EQ(send_info.length, packet.size()); |
| EXPECT_EQ(send_info.rtp_timestamp, packet.Timestamp()); |
| EXPECT_EQ(send_info.packet_type, packet.packet_type()); |
| EXPECT_EQ(send_info.pacing_info, paced_info); |
| if (packet.transport_sequence_number()) { |
| EXPECT_EQ(send_info.transport_sequence_number, |
| *packet.transport_sequence_number() & 0xFFFF); |
| } else { |
| EXPECT_EQ(send_info.transport_sequence_number, |
| *packet.GetExtension<TransportSequenceNumber>()); |
| } |
| } |
| |
| TEST(RtpPacketSendInfoTest, FromConvertsMediaPackets) { |
| RtpPacketToSend packet = BuildPacket(RtpPacketMediaType::kAudio); |
| PacedPacketInfo paced_info; |
| paced_info.probe_cluster_id = 8; |
| |
| RtpPacketSendInfo send_info = RtpPacketSendInfo::From(packet, paced_info); |
| EXPECT_EQ(send_info.media_ssrc, packet.Ssrc()); |
| VerifyDefaultProperties(send_info, packet, paced_info); |
| } |
| |
| TEST(RtpPacketSendInfoTest, FromConvertsPadding) { |
| RtpPacketToSend packet = BuildPacket(RtpPacketMediaType::kPadding); |
| PacedPacketInfo paced_info; |
| paced_info.probe_cluster_id = 8; |
| |
| RtpPacketSendInfo send_info = RtpPacketSendInfo::From(packet, paced_info); |
| EXPECT_EQ(send_info.media_ssrc, std::nullopt); |
| VerifyDefaultProperties(send_info, packet, paced_info); |
| } |
| |
| TEST(RtpPacketSendInfoTest, FromConvertsFec) { |
| RtpPacketToSend packet = |
| BuildPacket(RtpPacketMediaType::kForwardErrorCorrection); |
| PacedPacketInfo paced_info; |
| paced_info.probe_cluster_id = 8; |
| |
| RtpPacketSendInfo send_info = RtpPacketSendInfo::From(packet, paced_info); |
| EXPECT_EQ(send_info.media_ssrc, std::nullopt); |
| VerifyDefaultProperties(send_info, packet, paced_info); |
| } |
| |
| TEST(RtpPacketSendInfoTest, FromConvertsRetransmission) { |
| RtpPacketToSend packet = BuildPacket(RtpPacketMediaType::kRetransmission); |
| PacedPacketInfo paced_info; |
| paced_info.probe_cluster_id = 8; |
| |
| RtpPacketSendInfo send_info = RtpPacketSendInfo::From(packet, paced_info); |
| EXPECT_EQ(send_info.media_ssrc, *packet.original_ssrc()); |
| EXPECT_EQ(send_info.rtp_sequence_number, |
| *packet.retransmitted_sequence_number()); |
| VerifyDefaultProperties(send_info, packet, paced_info); |
| } |
| |
| TEST(RtpPacketSendInfoTest, FromFallbackToTranportSequenceHeaderExtension) { |
| RtpHeaderExtensionMap extension_manager; |
| extension_manager.Register<TransportSequenceNumber>(/*id=*/1); |
| PacedPacketInfo paced_info; |
| paced_info.probe_cluster_id = 8; |
| RtpPacketToSend packet(&extension_manager); |
| packet.SetSsrc(1); |
| packet.SetSequenceNumber(89); |
| const uint16_t kTransportSequenceNumber = 5555; |
| packet.SetExtension<TransportSequenceNumber>(kTransportSequenceNumber); |
| packet.SetTimestamp(123); |
| packet.AllocatePayload(5); |
| packet.set_packet_type(RtpPacketMediaType::kAudio); |
| |
| RtpPacketSendInfo send_info = RtpPacketSendInfo::From(packet, paced_info); |
| VerifyDefaultProperties(send_info, packet, paced_info); |
| } |
| |
| } // namespace |
| } // namespace webrtc |