Avoid using legacy rtp parser in neteq test::Packet
Bug: None Change-Id: I9184954d9c99f0a34ae335d03843171864071e5d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/222648 Reviewed-by: Ivo Creusen <ivoc@webrtc.org> Commit-Queue: Danil Chapovalov <danilchap@webrtc.org> Cr-Commit-Position: refs/heads/master@{#34316}
This commit is contained in:
committed by
WebRTC LUCI CQ
parent
35b21ba8d4
commit
b4100ad06a
@ -10,30 +10,22 @@
|
||||
|
||||
#include "modules/audio_coding/neteq/tools/packet.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "modules/rtp_rtcp/source/rtp_utility.h"
|
||||
#include "api/array_view.h"
|
||||
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
|
||||
#include "rtc_base/checks.h"
|
||||
#include "rtc_base/copy_on_write_buffer.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace test {
|
||||
|
||||
using webrtc::RtpUtility::RtpHeaderParser;
|
||||
|
||||
Packet::Packet(uint8_t* packet_memory,
|
||||
size_t allocated_bytes,
|
||||
Packet::Packet(rtc::CopyOnWriteBuffer packet,
|
||||
size_t virtual_packet_length_bytes,
|
||||
double time_ms,
|
||||
const RtpUtility::RtpHeaderParser& parser,
|
||||
const RtpHeaderExtensionMap* extension_map /*= nullptr*/)
|
||||
: payload_memory_(packet_memory),
|
||||
packet_length_bytes_(allocated_bytes),
|
||||
const RtpHeaderExtensionMap* extension_map)
|
||||
: packet_(std::move(packet)),
|
||||
virtual_packet_length_bytes_(virtual_packet_length_bytes),
|
||||
virtual_payload_length_bytes_(0),
|
||||
time_ms_(time_ms),
|
||||
valid_header_(ParseHeader(parser, extension_map)) {}
|
||||
valid_header_(ParseHeader(extension_map)) {}
|
||||
|
||||
Packet::Packet(const RTPHeader& header,
|
||||
size_t virtual_packet_length_bytes,
|
||||
@ -45,23 +37,6 @@ Packet::Packet(const RTPHeader& header,
|
||||
time_ms_(time_ms),
|
||||
valid_header_(true) {}
|
||||
|
||||
Packet::Packet(uint8_t* packet_memory, size_t allocated_bytes, double time_ms)
|
||||
: Packet(packet_memory,
|
||||
allocated_bytes,
|
||||
allocated_bytes,
|
||||
time_ms,
|
||||
RtpUtility::RtpHeaderParser(packet_memory, allocated_bytes)) {}
|
||||
|
||||
Packet::Packet(uint8_t* packet_memory,
|
||||
size_t allocated_bytes,
|
||||
size_t virtual_packet_length_bytes,
|
||||
double time_ms)
|
||||
: Packet(packet_memory,
|
||||
allocated_bytes,
|
||||
virtual_packet_length_bytes,
|
||||
time_ms,
|
||||
RtpUtility::RtpHeaderParser(packet_memory, allocated_bytes)) {}
|
||||
|
||||
Packet::~Packet() = default;
|
||||
|
||||
bool Packet::ExtractRedHeaders(std::list<RTPHeader*>* headers) const {
|
||||
@ -77,9 +52,8 @@ bool Packet::ExtractRedHeaders(std::list<RTPHeader*>* headers) const {
|
||||
// +-+-+-+-+-+-+-+-+
|
||||
//
|
||||
|
||||
RTC_DCHECK(payload_);
|
||||
const uint8_t* payload_ptr = payload_;
|
||||
const uint8_t* payload_end_ptr = payload_ptr + payload_length_bytes_;
|
||||
const uint8_t* payload_ptr = payload();
|
||||
const uint8_t* payload_end_ptr = payload_ptr + payload_length_bytes();
|
||||
|
||||
// Find all RED headers with the extension bit set to 1. That is, all headers
|
||||
// but the last one.
|
||||
@ -111,27 +85,43 @@ void Packet::DeleteRedHeaders(std::list<RTPHeader*>* headers) {
|
||||
}
|
||||
}
|
||||
|
||||
bool Packet::ParseHeader(const RtpHeaderParser& parser,
|
||||
const RtpHeaderExtensionMap* extension_map) {
|
||||
bool valid_header = parser.Parse(&header_, extension_map);
|
||||
bool Packet::ParseHeader(const RtpHeaderExtensionMap* extension_map) {
|
||||
// Use RtpPacketReceived instead of RtpPacket because former already has a
|
||||
// converter into legacy RTPHeader.
|
||||
webrtc::RtpPacketReceived rtp_packet(extension_map);
|
||||
|
||||
// Special case for dummy packets that have padding marked in the RTP header.
|
||||
// This causes the RTP header parser to report failure, but is fine in this
|
||||
// context.
|
||||
const bool header_only_with_padding =
|
||||
(header_.headerLength == packet_length_bytes_ &&
|
||||
header_.paddingLength > 0);
|
||||
if (!valid_header && !header_only_with_padding) {
|
||||
return false;
|
||||
// Because of the special case of dummy packets that have padding marked in
|
||||
// the RTP header, but do not have rtp payload with the padding size, handle
|
||||
// padding manually. Regular RTP packet parser reports failure, but it is fine
|
||||
// in this context.
|
||||
bool padding = (packet_[0] & 0b0010'0000);
|
||||
size_t padding_size = 0;
|
||||
if (padding) {
|
||||
// Clear the padding bit to prevent failure when rtp payload is omited.
|
||||
rtc::CopyOnWriteBuffer packet(packet_);
|
||||
packet.MutableData()[0] &= ~0b0010'0000;
|
||||
if (!rtp_packet.Parse(std::move(packet))) {
|
||||
return false;
|
||||
}
|
||||
if (rtp_packet.payload_size() > 0) {
|
||||
padding_size = rtp_packet.data()[rtp_packet.size() - 1];
|
||||
}
|
||||
if (padding_size > rtp_packet.payload_size()) {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
if (!rtp_packet.Parse(packet_)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
RTC_DCHECK_LE(header_.headerLength, packet_length_bytes_);
|
||||
payload_ = &payload_memory_[header_.headerLength];
|
||||
RTC_DCHECK_GE(packet_length_bytes_, header_.headerLength);
|
||||
payload_length_bytes_ = packet_length_bytes_ - header_.headerLength;
|
||||
RTC_CHECK_GE(virtual_packet_length_bytes_, packet_length_bytes_);
|
||||
RTC_DCHECK_GE(virtual_packet_length_bytes_, header_.headerLength);
|
||||
rtp_payload_ = rtc::MakeArrayView(packet_.data() + rtp_packet.headers_size(),
|
||||
rtp_packet.payload_size() - padding_size);
|
||||
rtp_packet.GetHeader(&header_);
|
||||
|
||||
RTC_CHECK_GE(virtual_packet_length_bytes_, rtp_packet.size());
|
||||
RTC_DCHECK_GE(virtual_packet_length_bytes_, rtp_packet.headers_size());
|
||||
virtual_payload_length_bytes_ =
|
||||
virtual_packet_length_bytes_ - header_.headerLength;
|
||||
virtual_packet_length_bytes_ - rtp_packet.headers_size();
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user