Implements method on RtpPacket to extract extension.
Removing extension will be used in DatagramDtlsAdaptor to remove transport sequence number to avoid having both datagram and RTP feedback loops. The sequence number will be stored in temporary map and used to re-create RTCP fdeedback packed when we receive datagram ACK. It would enable integration of Datagram transport without any changes in the upper layers of RTP stack. Note that Datagram adaptor changes will be implemented in a separate changelist. In this change: - Implement method to remove extension by rebuilding entire packet without given extension type. - Fails if extension is not registered or not set. - Unit test Bug: webrtc:9719 Change-Id: I9d3811d5d97fadde5a294d5da643b2ebc6a8196e Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/145100 Reviewed-by: Stefan Holmer <stefan@webrtc.org> Reviewed-by: Bjorn Mellem <mellem@webrtc.org> Commit-Queue: Anton Sukhanov <sukhanov@webrtc.org> Cr-Commit-Position: refs/heads/master@{#28530}
This commit is contained in:
committed by
Commit Bot
parent
ca5f21e293
commit
ff25b873bf
@ -18,6 +18,7 @@
|
||||
#include "rtc_base/checks.h"
|
||||
#include "rtc_base/logging.h"
|
||||
#include "rtc_base/numerics/safe_conversions.h"
|
||||
#include "rtc_base/strings/string_builder.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace {
|
||||
@ -627,4 +628,72 @@ bool RtpPacket::IsExtensionReserved(ExtensionType type) const {
|
||||
return FindExtensionInfo(id) != nullptr;
|
||||
}
|
||||
|
||||
bool RtpPacket::RemoveExtension(ExtensionType type) {
|
||||
uint8_t id_to_remove = extensions_.GetId(type);
|
||||
if (id_to_remove == ExtensionManager::kInvalidId) {
|
||||
// Extension not registered.
|
||||
RTC_LOG(LS_ERROR) << "Extension not registered, type=" << type
|
||||
<< ", packet=" << ToString();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Rebuild new packet from scratch.
|
||||
RtpPacket new_packet;
|
||||
|
||||
new_packet.SetMarker(Marker());
|
||||
new_packet.SetPayloadType(PayloadType());
|
||||
new_packet.SetSequenceNumber(SequenceNumber());
|
||||
new_packet.SetTimestamp(Timestamp());
|
||||
new_packet.SetSsrc(Ssrc());
|
||||
new_packet.IdentifyExtensions(extensions_);
|
||||
|
||||
// Copy all extensions, except the one we are removing.
|
||||
bool found_extension = false;
|
||||
for (const ExtensionInfo& ext : extension_entries_) {
|
||||
if (ext.id == id_to_remove) {
|
||||
found_extension = true;
|
||||
} else {
|
||||
auto extension_data = new_packet.AllocateRawExtension(ext.id, ext.length);
|
||||
if (extension_data.size() != ext.length) {
|
||||
RTC_LOG(LS_ERROR) << "Failed to allocate extension id=" << ext.id
|
||||
<< ", length=" << ext.length
|
||||
<< ", packet=" << ToString();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Copy extension data to new packet.
|
||||
memcpy(extension_data.data(), ReadAt(ext.offset), ext.length);
|
||||
}
|
||||
}
|
||||
|
||||
if (!found_extension) {
|
||||
RTC_LOG(LS_WARNING) << "Extension not present in RTP packet, type=" << type
|
||||
<< ", packet=" << ToString();
|
||||
return false;
|
||||
}
|
||||
|
||||
// Copy payload data to new packet.
|
||||
memcpy(new_packet.AllocatePayload(payload_size()), payload().data(),
|
||||
payload_size());
|
||||
|
||||
// Allocate padding -- must be last!
|
||||
new_packet.SetPadding(padding_size());
|
||||
|
||||
// Success, replace current packet with newly built packet.
|
||||
*this = new_packet;
|
||||
return true;
|
||||
}
|
||||
|
||||
std::string RtpPacket::ToString() const {
|
||||
rtc::StringBuilder result;
|
||||
result << "{payload_type=" << payload_type_ << "marker=" << marker_
|
||||
<< ", sequence_number=" << sequence_number_
|
||||
<< ", padding_size=" << padding_size_ << ", timestamp=" << timestamp_
|
||||
<< ", ssrc=" << ssrc_ << ", payload_offset=" << payload_offset_
|
||||
<< ", payload_size=" << payload_size_ << ", total_size=" << size()
|
||||
<< "}";
|
||||
|
||||
return result.Release();
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
Reference in New Issue
Block a user