1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
/*
* 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 "api/transport/network_types.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 "rtc_base/checks.h"
namespace webrtc {
RtpPacketSendInfo RtpPacketSendInfo::From(const RtpPacketToSend& packet,
const PacedPacketInfo& pacing_info) {
RtpPacketSendInfo packet_info;
if (packet.transport_sequence_number()) {
packet_info.transport_sequence_number =
*packet.transport_sequence_number() & 0xFFFF;
} else {
std::optional<uint16_t> packet_id =
packet.GetExtension<TransportSequenceNumber>();
if (packet_id) {
packet_info.transport_sequence_number = *packet_id;
}
}
packet_info.rtp_timestamp = packet.Timestamp();
packet_info.length = packet.size();
packet_info.pacing_info = pacing_info;
packet_info.packet_type = packet.packet_type();
switch (*packet_info.packet_type) {
case RtpPacketMediaType::kAudio:
case RtpPacketMediaType::kVideo:
packet_info.media_ssrc = packet.Ssrc();
packet_info.rtp_sequence_number = packet.SequenceNumber();
break;
case RtpPacketMediaType::kRetransmission:
RTC_DCHECK(packet.original_ssrc() &&
packet.retransmitted_sequence_number());
// For retransmissions, we're want to remove the original media packet
// if the retransmit arrives - so populate that in the packet info.
packet_info.media_ssrc = packet.original_ssrc().value_or(0);
packet_info.rtp_sequence_number =
packet.retransmitted_sequence_number().value_or(0);
break;
case RtpPacketMediaType::kPadding:
case RtpPacketMediaType::kForwardErrorCorrection:
// We're not interested in feedback about these packets being received
// or lost.
break;
}
return packet_info;
}
} // namespace webrtc
|