Replace test packet NetEqInput::PacketData with RtpPacketReceived
Reducing number of representation of an RTP packet.
Bug: webrtc:42225366
Change-Id: I829567d652c895c012056469945c1b72c409dca8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/404140
Reviewed-by: Jakob Ivarsson‎ <jakobi@webrtc.org>
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45322}
diff --git a/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc b/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc
index edd57a0..df858f9 100644
--- a/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc
+++ b/modules/audio_coding/neteq/neteq_decoder_plc_unittest.cc
@@ -30,6 +30,7 @@
#include "modules/audio_coding/neteq/tools/input_audio_file.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
#include "modules/audio_coding/neteq/tools/neteq_test.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/buffer.h"
#include "rtc_base/checks.h"
#include "rtc_base/numerics/safe_conversions.h"
@@ -141,7 +142,7 @@
return input_->NextSetMinimumDelayInfo();
}
- std::unique_ptr<PacketData> PopPacket() override {
+ std::unique_ptr<RtpPacketReceived> PopPacket() override {
if (loss_cadence_ != 0 && (++count_ % loss_cadence_) == 0) {
// Pop `burst_length_` packets to create the loss.
auto packet_to_return = input_->PopPacket();
diff --git a/modules/audio_coding/neteq/tools/encode_neteq_input.cc b/modules/audio_coding/neteq/tools/encode_neteq_input.cc
index e763d78..c9a842b 100644
--- a/modules/audio_coding/neteq/tools/encode_neteq_input.cc
+++ b/modules/audio_coding/neteq/tools/encode_neteq_input.cc
@@ -18,7 +18,9 @@
#include "api/audio_codecs/audio_encoder.h"
#include "api/rtp_headers.h"
-#include "modules/audio_coding/neteq/tools/neteq_input.h"
+#include "api/units/timestamp.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
+#include "rtc_base/buffer.h"
#include "rtc_base/checks.h"
#include "rtc_base/numerics/safe_conversions.h"
@@ -38,17 +40,17 @@
std::optional<int64_t> EncodeNetEqInput::NextPacketTime() const {
RTC_DCHECK(packet_data_);
- return static_cast<int64_t>(packet_data_->time_ms);
+ return packet_data_->arrival_time().ms();
}
std::optional<int64_t> EncodeNetEqInput::NextOutputEventTime() const {
return next_output_event_ms_;
}
-std::unique_ptr<NetEqInput::PacketData> EncodeNetEqInput::PopPacket() {
+std::unique_ptr<RtpPacketReceived> EncodeNetEqInput::PopPacket() {
RTC_DCHECK(packet_data_);
// Grab the packet to return...
- std::unique_ptr<PacketData> packet_to_return = std::move(packet_data_);
+ std::unique_ptr<RtpPacketReceived> packet_to_return = std::move(packet_data_);
// ... and line up the next packet for future use.
CreatePacket();
@@ -65,35 +67,38 @@
std::optional<RTPHeader> EncodeNetEqInput::NextHeader() const {
RTC_DCHECK(packet_data_);
- return packet_data_->header;
+ std::optional<RTPHeader> rtp_header(std::in_place);
+ packet_data_->GetHeader(&*rtp_header);
+ return rtp_header;
}
void EncodeNetEqInput::CreatePacket() {
// Create a new PacketData object.
RTC_DCHECK(!packet_data_);
- packet_data_.reset(new NetEqInput::PacketData);
- RTC_DCHECK_EQ(packet_data_->payload.size(), 0);
+ packet_data_ = std::make_unique<RtpPacketReceived>();
// Loop until we get a packet.
AudioEncoder::EncodedInfo info;
RTC_DCHECK(!info.send_even_if_empty);
int num_blocks = 0;
- while (packet_data_->payload.empty() && !info.send_even_if_empty) {
+ Buffer payload;
+ while (payload.empty() && !info.send_even_if_empty) {
const size_t num_samples = CheckedDivExact(
static_cast<int>(encoder_->SampleRateHz() * kOutputPeriodMs), 1000);
info = encoder_->Encode(rtp_timestamp_, generator_->Generate(num_samples),
- &packet_data_->payload);
+ &payload);
rtp_timestamp_ +=
dchecked_cast<uint32_t>(num_samples * encoder_->RtpTimestampRateHz() /
encoder_->SampleRateHz());
++num_blocks;
}
- packet_data_->header.timestamp = info.encoded_timestamp;
- packet_data_->header.payloadType = info.payload_type;
- packet_data_->header.sequenceNumber = sequence_number_++;
- packet_data_->time_ms = next_packet_time_ms_;
+ packet_data_->SetPayload(payload);
+ packet_data_->SetTimestamp(info.encoded_timestamp);
+ packet_data_->SetPayloadType(info.payload_type);
+ packet_data_->SetSequenceNumber(sequence_number_++);
+ packet_data_->set_arrival_time(Timestamp::Millis(next_packet_time_ms_));
next_packet_time_ms_ += num_blocks * kOutputPeriodMs;
}
diff --git a/modules/audio_coding/neteq/tools/encode_neteq_input.h b/modules/audio_coding/neteq/tools/encode_neteq_input.h
index eb8fea7..1fe42d3 100644
--- a/modules/audio_coding/neteq/tools/encode_neteq_input.h
+++ b/modules/audio_coding/neteq/tools/encode_neteq_input.h
@@ -20,6 +20,7 @@
#include "api/audio_codecs/audio_encoder.h"
#include "api/rtp_headers.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
namespace webrtc {
namespace test {
@@ -50,7 +51,7 @@
return std::nullopt;
}
- std::unique_ptr<PacketData> PopPacket() override;
+ std::unique_ptr<RtpPacketReceived> PopPacket() override;
void AdvanceOutputEvent() override;
@@ -67,7 +68,7 @@
std::unique_ptr<Generator> generator_;
std::unique_ptr<AudioEncoder> encoder_;
- std::unique_ptr<PacketData> packet_data_;
+ std::unique_ptr<RtpPacketReceived> packet_data_;
uint32_t rtp_timestamp_ = 0;
int16_t sequence_number_ = 0;
int64_t next_packet_time_ms_ = 0;
diff --git a/modules/audio_coding/neteq/tools/initial_packet_inserter_neteq_input.cc b/modules/audio_coding/neteq/tools/initial_packet_inserter_neteq_input.cc
index b2bb4f1..a658552 100644
--- a/modules/audio_coding/neteq/tools/initial_packet_inserter_neteq_input.cc
+++ b/modules/audio_coding/neteq/tools/initial_packet_inserter_neteq_input.cc
@@ -17,7 +17,7 @@
#include "api/rtp_headers.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
-#include "rtc_base/buffer.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/checks.h"
namespace webrtc {
@@ -45,7 +45,7 @@
return source_->NextSetMinimumDelayInfo();
}
-std::unique_ptr<InitialPacketInserterNetEqInput::PacketData>
+std::unique_ptr<RtpPacketReceived>
InitialPacketInserterNetEqInput::PopPacket() {
if (!first_packet_) {
first_packet_ = source_->PopPacket();
@@ -56,15 +56,13 @@
}
if (packets_to_insert_ > 0) {
RTC_CHECK(first_packet_);
- auto dummy_packet = std::unique_ptr<PacketData>(new PacketData());
- dummy_packet->header = first_packet_->header;
- dummy_packet->payload =
- Buffer(first_packet_->payload.data(), first_packet_->payload.size());
- dummy_packet->time_ms = first_packet_->time_ms;
- dummy_packet->header.sequenceNumber -= packets_to_insert_;
+ auto dummy_packet = std::make_unique<RtpPacketReceived>(*first_packet_);
+ dummy_packet->SetSequenceNumber(first_packet_->SequenceNumber() -
+ packets_to_insert_);
// This assumes 20ms per packet.
- dummy_packet->header.timestamp -=
- 20 * sample_rate_hz_ * packets_to_insert_ / 1000;
+ dummy_packet->SetTimestamp(first_packet_->Timestamp() -
+ 20 * sample_rate_hz_ * packets_to_insert_ /
+ 1000);
packets_to_insert_--;
return dummy_packet;
}
diff --git a/modules/audio_coding/neteq/tools/initial_packet_inserter_neteq_input.h b/modules/audio_coding/neteq/tools/initial_packet_inserter_neteq_input.h
index 47939de..a6fa513 100644
--- a/modules/audio_coding/neteq/tools/initial_packet_inserter_neteq_input.h
+++ b/modules/audio_coding/neteq/tools/initial_packet_inserter_neteq_input.h
@@ -17,6 +17,7 @@
#include "api/rtp_headers.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
namespace webrtc {
namespace test {
@@ -31,7 +32,7 @@
std::optional<int64_t> NextPacketTime() const override;
std::optional<int64_t> NextOutputEventTime() const override;
std::optional<SetMinimumDelayInfo> NextSetMinimumDelayInfo() const override;
- std::unique_ptr<PacketData> PopPacket() override;
+ std::unique_ptr<RtpPacketReceived> PopPacket() override;
void AdvanceOutputEvent() override;
void AdvanceSetMinimumDelay() override;
bool ended() const override;
@@ -41,7 +42,7 @@
const std::unique_ptr<NetEqInput> source_;
int packets_to_insert_;
const int sample_rate_hz_;
- std::unique_ptr<PacketData> first_packet_;
+ std::unique_ptr<RtpPacketReceived> first_packet_;
};
} // namespace test
diff --git a/modules/audio_coding/neteq/tools/neteq_delay_analyzer.cc b/modules/audio_coding/neteq/tools/neteq_delay_analyzer.cc
index 894eef9..76ba747 100644
--- a/modules/audio_coding/neteq/tools/neteq_delay_analyzer.cc
+++ b/modules/audio_coding/neteq/tools/neteq_delay_analyzer.cc
@@ -25,7 +25,7 @@
#include "api/audio/audio_frame.h"
#include "api/neteq/neteq.h"
#include "api/rtp_packet_info.h"
-#include "modules/audio_coding/neteq/tools/neteq_input.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/checks.h"
#include "rtc_base/numerics/sequence_number_unwrapper.h"
@@ -92,13 +92,12 @@
} // namespace
-void NetEqDelayAnalyzer::AfterInsertPacket(
- const test::NetEqInput::PacketData& packet,
- NetEq* /* neteq */) {
- data_.insert(
- std::make_pair(packet.header.timestamp, TimingData(packet.time_ms)));
- ssrcs_.insert(packet.header.ssrc);
- payload_types_.insert(packet.header.payloadType);
+void NetEqDelayAnalyzer::AfterInsertPacket(const RtpPacketReceived& packet,
+ NetEq* /* neteq */) {
+ data_.insert(std::make_pair(packet.Timestamp(),
+ TimingData(packet.arrival_time().ms())));
+ ssrcs_.insert(packet.Ssrc());
+ payload_types_.insert(packet.PayloadType());
}
void NetEqDelayAnalyzer::BeforeGetAudio(NetEq* neteq) {
diff --git a/modules/audio_coding/neteq/tools/neteq_delay_analyzer.h b/modules/audio_coding/neteq/tools/neteq_delay_analyzer.h
index caa3302..e19920b 100644
--- a/modules/audio_coding/neteq/tools/neteq_delay_analyzer.h
+++ b/modules/audio_coding/neteq/tools/neteq_delay_analyzer.h
@@ -22,8 +22,8 @@
#include "absl/strings/string_view.h"
#include "api/audio/audio_frame.h"
#include "api/neteq/neteq.h"
-#include "modules/audio_coding/neteq/tools/neteq_input.h"
#include "modules/audio_coding/neteq/tools/neteq_test.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
namespace webrtc {
namespace test {
@@ -31,7 +31,7 @@
class NetEqDelayAnalyzer : public test::NetEqPostInsertPacket,
public test::NetEqGetAudioCallback {
public:
- void AfterInsertPacket(const test::NetEqInput::PacketData& packet,
+ void AfterInsertPacket(const RtpPacketReceived& packet,
NetEq* neteq) override;
void BeforeGetAudio(NetEq* neteq) override;
diff --git a/modules/audio_coding/neteq/tools/neteq_event_log_input.cc b/modules/audio_coding/neteq/tools/neteq_event_log_input.cc
index 9066bd6..64bcc34 100644
--- a/modules/audio_coding/neteq/tools/neteq_event_log_input.cc
+++ b/modules/audio_coding/neteq/tools/neteq_event_log_input.cc
@@ -11,17 +11,20 @@
#include "modules/audio_coding/neteq/tools/neteq_event_log_input.h"
#include <algorithm>
+#include <cstddef>
#include <cstdint>
#include <memory>
#include <optional>
#include <vector>
+#include "api/array_view.h"
#include "api/rtp_headers.h"
#include "logging/rtc_event_log/events/logged_rtp_rtcp.h"
#include "logging/rtc_event_log/events/rtc_event_audio_playout.h"
#include "logging/rtc_event_log/events/rtc_event_neteq_set_minimum_delay.h"
#include "logging/rtc_event_log/rtc_event_log_parser.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
namespace webrtc {
namespace test {
@@ -84,19 +87,25 @@
neteq_set_minimum_delay_events_it_->minimum_delay_ms);
}
- std::unique_ptr<PacketData> PopPacket() override {
+ std::unique_ptr<RtpPacketReceived> PopPacket() override {
if (packet_stream_it_ == packet_stream_.end()) {
return nullptr;
}
- auto packet_data = std::make_unique<PacketData>();
- packet_data->header = packet_stream_it_->rtp.header;
- packet_data->time_ms = packet_stream_it_->rtp.log_time_ms();
+ const LoggedRtpPacket& logged = packet_stream_it_->rtp;
+ auto packet_data = std::make_unique<RtpPacketReceived>();
+ packet_data->SetPayloadType(logged.header.payloadType);
+ packet_data->SetMarker(logged.header.markerBit);
+ packet_data->SetSequenceNumber(logged.header.sequenceNumber);
+ packet_data->SetTimestamp(logged.header.timestamp);
+ packet_data->SetSsrc(logged.header.ssrc);
+ packet_data->SetCsrcs(
+ MakeArrayView(logged.header.arrOfCSRCs, logged.header.numCSRCs));
+ packet_data->set_arrival_time(logged.log_time());
// This is a header-only "dummy" packet. Set the payload to all zeros, with
// length according to the virtual length.
- packet_data->payload.SetSize(packet_stream_it_->rtp.total_length -
- packet_stream_it_->rtp.header_length);
- std::fill_n(packet_data->payload.data(), packet_data->payload.size(), 0);
+ size_t payload_size = logged.total_length - logged.header_length;
+ std::fill_n(packet_data->AllocatePayload(payload_size), payload_size, 0);
++packet_stream_it_;
return packet_data;
diff --git a/modules/audio_coding/neteq/tools/neteq_input.cc b/modules/audio_coding/neteq/tools/neteq_input.cc
index 8c27b8e..d335917 100644
--- a/modules/audio_coding/neteq/tools/neteq_input.cc
+++ b/modules/audio_coding/neteq/tools/neteq_input.cc
@@ -17,35 +17,33 @@
#include <utility>
#include "api/rtp_headers.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/strings/string_builder.h"
namespace webrtc {
namespace test {
-NetEqInput::PacketData::PacketData() = default;
-NetEqInput::PacketData::~PacketData() = default;
-
-std::string NetEqInput::PacketData::ToString() const {
+std::string NetEqInput::ToString(const RtpPacketReceived& packet) {
StringBuilder ss;
ss << "{"
"time_ms: "
- << static_cast<int64_t>(time_ms)
+ << packet.arrival_time().ms()
<< ", "
"header: {"
"pt: "
- << static_cast<int>(header.payloadType)
+ << static_cast<int>(packet.PayloadType())
<< ", "
"sn: "
- << header.sequenceNumber
+ << packet.SequenceNumber()
<< ", "
"ts: "
- << header.timestamp
+ << packet.Timestamp()
<< ", "
"ssrc: "
- << header.ssrc
+ << packet.Ssrc()
<< "}, "
"payload bytes: "
- << payload.size() << "}";
+ << packet.payload_size() << "}";
return ss.Release();
}
@@ -70,9 +68,9 @@
return ended_ ? std::nullopt : input_->NextSetMinimumDelayInfo();
}
-std::unique_ptr<NetEqInput::PacketData> TimeLimitedNetEqInput::PopPacket() {
+std::unique_ptr<RtpPacketReceived> TimeLimitedNetEqInput::PopPacket() {
if (ended_) {
- return std::unique_ptr<PacketData>();
+ return nullptr;
}
auto packet = input_->PopPacket();
MaybeSetEnded();
diff --git a/modules/audio_coding/neteq/tools/neteq_input.h b/modules/audio_coding/neteq/tools/neteq_input.h
index 269d7b6..49560a6 100644
--- a/modules/audio_coding/neteq/tools/neteq_input.h
+++ b/modules/audio_coding/neteq/tools/neteq_input.h
@@ -18,7 +18,7 @@
#include <string>
#include "api/rtp_headers.h"
-#include "rtc_base/buffer.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
namespace webrtc {
namespace test {
@@ -26,16 +26,6 @@
// Interface class for input to the NetEqTest class.
class NetEqInput {
public:
- struct PacketData {
- PacketData();
- ~PacketData();
- std::string ToString() const;
-
- RTPHeader header;
- Buffer payload;
- int64_t time_ms;
- };
-
struct SetMinimumDelayInfo {
SetMinimumDelayInfo(int64_t timestamp_ms_in, int delay_ms_in)
: timestamp_ms(timestamp_ms_in), delay_ms(delay_ms_in) {}
@@ -43,6 +33,8 @@
int delay_ms;
};
+ static std::string ToString(const RtpPacketReceived& packet);
+
virtual ~NetEqInput() = default;
// Returns at what time (in ms) NetEq::InsertPacket should be called next, or
@@ -84,7 +76,7 @@
// returned one is pre-fetched in the NetEqInput object, such that future
// calls to NextPacketTime() or NextHeader() will return information from that
// packet.
- virtual std::unique_ptr<PacketData> PopPacket() = 0;
+ virtual std::unique_ptr<RtpPacketReceived> PopPacket() = 0;
// Move to the next output event. This will make NextOutputEventTime() return
// a new value (potentially the same if several output events share the same
@@ -115,7 +107,7 @@
std::optional<int64_t> NextPacketTime() const override;
std::optional<int64_t> NextOutputEventTime() const override;
std::optional<SetMinimumDelayInfo> NextSetMinimumDelayInfo() const override;
- std::unique_ptr<PacketData> PopPacket() override;
+ std::unique_ptr<RtpPacketReceived> PopPacket() override;
void AdvanceOutputEvent() override;
void AdvanceSetMinimumDelay() override;
bool ended() const override;
diff --git a/modules/audio_coding/neteq/tools/neteq_replacement_input.cc b/modules/audio_coding/neteq/tools/neteq_replacement_input.cc
index 374279f..9b8268f 100644
--- a/modules/audio_coding/neteq/tools/neteq_replacement_input.cc
+++ b/modules/audio_coding/neteq/tools/neteq_replacement_input.cc
@@ -20,6 +20,7 @@
#include "api/rtp_headers.h"
#include "modules/audio_coding/neteq/tools/fake_decode_from_file.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/checks.h"
namespace webrtc {
@@ -40,9 +41,7 @@
}
std::optional<int64_t> NetEqReplacementInput::NextPacketTime() const {
- return packet_
- ? std::optional<int64_t>(static_cast<int64_t>(packet_->time_ms))
- : std::nullopt;
+ return packet_ ? std::optional(packet_->arrival_time().ms()) : std::nullopt;
}
std::optional<int64_t> NetEqReplacementInput::NextOutputEventTime() const {
@@ -54,13 +53,13 @@
return source_->NextSetMinimumDelayInfo();
}
-std::unique_ptr<NetEqInput::PacketData> NetEqReplacementInput::PopPacket() {
- std::unique_ptr<PacketData> to_return = std::move(packet_);
+std::unique_ptr<RtpPacketReceived> NetEqReplacementInput::PopPacket() {
+ std::unique_ptr<RtpPacketReceived> to_return = std::move(packet_);
while (true) {
packet_ = source_->PopPacket();
if (!packet_)
break;
- if (packet_->payload.size() > packet_->header.paddingLength) {
+ if (!packet_->payload().empty()) {
// Not padding only. Good to go. Skip this packet otherwise.
break;
}
@@ -95,15 +94,15 @@
RTC_DCHECK(packet_);
- RTC_CHECK_EQ(forbidden_types_.count(packet_->header.payloadType), 0)
- << "Payload type " << static_cast<int>(packet_->header.payloadType)
+ RTC_CHECK_EQ(forbidden_types_.count(packet_->PayloadType()), 0)
+ << "Payload type " << static_cast<int>(packet_->PayloadType())
<< " is forbidden.";
// Check if this packet is comfort noise.
- if (comfort_noise_types_.count(packet_->header.payloadType) != 0) {
+ if (comfort_noise_types_.count(packet_->PayloadType()) != 0) {
// If CNG, simply insert a zero-energy one-byte payload.
uint8_t cng_payload[1] = {127}; // Max attenuation of CNG.
- packet_->payload.SetData(cng_payload);
+ packet_->SetPayload(cng_payload);
return;
}
@@ -111,14 +110,13 @@
RTC_DCHECK(next_hdr);
uint8_t payload[12];
constexpr uint32_t kMaxFrameSize = 120 * 48;
- const uint32_t timestamp_diff =
- next_hdr->timestamp - packet_->header.timestamp;
+ const uint32_t timestamp_diff = next_hdr->timestamp - packet_->Timestamp();
uint32_t frame_size = last_frame_size_timestamps_;
if (timestamp_diff > 0) {
frame_size = std::min(frame_size, timestamp_diff);
}
- const bool opus_dtx = packet_->payload.size() <= 2;
- if (next_hdr->sequenceNumber == packet_->header.sequenceNumber + 1 &&
+ const bool opus_dtx = packet_->payload_size() <= 2;
+ if (next_hdr->sequenceNumber == packet_->SequenceNumber() + 1 &&
timestamp_diff <= kMaxFrameSize && timestamp_diff > 0 && !opus_dtx) {
// Packets are in order and the timestamp diff is valid.
frame_size = timestamp_diff;
@@ -126,10 +124,10 @@
}
RTC_DCHECK_LE(frame_size, kMaxFrameSize);
RTC_DCHECK_GT(frame_size, 0);
- FakeDecodeFromFile::PrepareEncoded(packet_->header.timestamp, frame_size,
- packet_->payload.size(), payload);
- packet_->payload.SetData(payload);
- packet_->header.payloadType = replacement_payload_type_;
+ FakeDecodeFromFile::PrepareEncoded(packet_->Timestamp(), frame_size,
+ packet_->payload_size(), payload);
+ packet_->SetPayload(payload);
+ packet_->SetPayloadType(replacement_payload_type_);
return;
}
diff --git a/modules/audio_coding/neteq/tools/neteq_replacement_input.h b/modules/audio_coding/neteq/tools/neteq_replacement_input.h
index a7efbc1..53ccde8 100644
--- a/modules/audio_coding/neteq/tools/neteq_replacement_input.h
+++ b/modules/audio_coding/neteq/tools/neteq_replacement_input.h
@@ -18,6 +18,7 @@
#include "api/rtp_headers.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
namespace webrtc {
namespace test {
@@ -34,7 +35,7 @@
std::optional<int64_t> NextPacketTime() const override;
std::optional<int64_t> NextOutputEventTime() const override;
std::optional<SetMinimumDelayInfo> NextSetMinimumDelayInfo() const override;
- std::unique_ptr<PacketData> PopPacket() override;
+ std::unique_ptr<RtpPacketReceived> PopPacket() override;
void AdvanceOutputEvent() override;
void AdvanceSetMinimumDelay() override;
bool ended() const override;
@@ -47,7 +48,7 @@
const uint8_t replacement_payload_type_;
const std::set<uint8_t> comfort_noise_types_;
const std::set<uint8_t> forbidden_types_;
- std::unique_ptr<PacketData> packet_; // The next packet to deliver.
+ std::unique_ptr<RtpPacketReceived> packet_; // The next packet to deliver.
uint32_t last_frame_size_timestamps_ = 960; // Initial guess: 20 ms @ 48 kHz.
};
diff --git a/modules/audio_coding/neteq/tools/neteq_rtp_dump_input.cc b/modules/audio_coding/neteq/tools/neteq_rtp_dump_input.cc
index d438900..a3e0e2d 100644
--- a/modules/audio_coding/neteq/tools/neteq_rtp_dump_input.cc
+++ b/modules/audio_coding/neteq/tools/neteq_rtp_dump_input.cc
@@ -14,6 +14,7 @@
#include <map>
#include <memory>
#include <optional>
+#include <utility>
#include "absl/strings/string_view.h"
#include "api/rtp_headers.h"
@@ -36,7 +37,7 @@
for (const auto& ext_pair : hdr_ext_map) {
source_->RegisterRtpHeaderExtension(ext_pair.second, ext_pair.first);
}
- LoadNextPacket();
+ packet_ = source_->NextPacket();
}
std::optional<int64_t> NextOutputEventTime() const override {
@@ -62,18 +63,11 @@
return packet_ ? std::optional(packet_->arrival_time().ms()) : std::nullopt;
}
- std::unique_ptr<PacketData> PopPacket() override {
+ std::unique_ptr<RtpPacketReceived> PopPacket() override {
if (!packet_) {
- return std::unique_ptr<PacketData>();
+ return nullptr;
}
- auto packet_data = std::make_unique<PacketData>();
- packet_->GetHeader(&packet_data->header);
- packet_data->payload.SetData(packet_->payload());
- packet_data->time_ms = packet_->arrival_time().ms();
-
- LoadNextPacket();
-
- return packet_data;
+ return std::exchange(packet_, source_->NextPacket());
}
std::optional<RTPHeader> NextHeader() const override {
@@ -88,8 +82,6 @@
bool ended() const override { return !next_output_event_ms_; }
private:
- void LoadNextPacket() { packet_ = source_->NextPacket(); }
-
std::optional<int64_t> next_output_event_ms_ = 0;
static constexpr int64_t kOutputPeriodMs = 10;
diff --git a/modules/audio_coding/neteq/tools/neteq_test.cc b/modules/audio_coding/neteq/tools/neteq_test.cc
index cfeccfd..ed8c10a 100644
--- a/modules/audio_coding/neteq/tools/neteq_test.cc
+++ b/modules/audio_coding/neteq/tools/neteq_test.cc
@@ -30,12 +30,14 @@
#include "api/neteq/default_neteq_factory.h"
#include "api/neteq/neteq.h"
#include "api/neteq/neteq_factory.h"
+#include "api/rtp_headers.h"
#include "api/scoped_refptr.h"
#include "api/test/neteq_simulator.h"
#include "api/units/timestamp.h"
#include "modules/audio_coding/neteq/tools/audio_sink.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
#include "modules/rtp_rtcp/source/byte_io.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/checks.h"
#include "system_wrappers/include/clock.h"
@@ -70,9 +72,9 @@
} // namespace
void DefaultNetEqTestErrorCallback::OnInsertPacketError(
- const NetEqInput::PacketData& packet) {
+ const RtpPacketReceived& packet) {
std::cerr << "InsertPacket returned an error." << std::endl;
- std::cerr << "Packet data: " << packet.ToString() << std::endl;
+ std::cerr << "Packet data: " << NetEqInput::ToString(packet) << std::endl;
RTC_FATAL();
}
@@ -133,14 +135,14 @@
time_now_ms = *input_->NextEventTime();
// Check if it is time to insert packet.
if (input_->NextPacketTime() && time_now_ms >= *input_->NextPacketTime()) {
- std::unique_ptr<NetEqInput::PacketData> packet_data = input_->PopPacket();
+ std::unique_ptr<RtpPacketReceived> packet_data = input_->PopPacket();
RTC_CHECK(packet_data);
- const size_t payload_data_length =
- packet_data->payload.size() - packet_data->header.paddingLength;
+ const size_t payload_data_length = packet_data->payload_size();
+ RTPHeader rtp_header;
+ packet_data->GetHeader(&rtp_header);
if (payload_data_length != 0) {
- int error = neteq_->InsertPacket(
- packet_data->header, ArrayView<const uint8_t>(packet_data->payload),
- Timestamp::Millis(time_now_ms));
+ int error = neteq_->InsertPacket(rtp_header, packet_data->payload(),
+ Timestamp::Millis(time_now_ms));
if (error != NetEq::kOK && callbacks_.error_callback) {
callbacks_.error_callback->OnInsertPacketError(*packet_data);
}
@@ -149,7 +151,7 @@
neteq_.get());
}
} else {
- neteq_->InsertEmptyPacket(packet_data->header);
+ neteq_->InsertEmptyPacket(rtp_header);
}
if (last_packet_time_ms_) {
current_state_.packet_iat_ms.push_back(time_now_ms -
@@ -161,30 +163,29 @@
last_packet_time_ms_ ? (time_now_ms - *last_packet_time_ms_) : -1;
const auto delta_timestamp =
last_packet_timestamp_
- ? (static_cast<int64_t>(packet_data->header.timestamp) -
+ ? (static_cast<int64_t>(packet_data->Timestamp()) -
*last_packet_timestamp_) *
1000 / sample_rate_hz_
: -1;
const auto packet_size_bytes =
- packet_data->payload.size() == 12
+ packet_data->payload_size() == 12
? ByteReader<uint32_t>::ReadLittleEndian(
- &packet_data->payload[8])
+ &packet_data->payload()[8])
: -1;
*text_log_ << "Packet - wallclock: " << std::setw(5) << time_now_ms
<< ", delta wc: " << std::setw(4) << delta_wallclock
- << ", seq_no: " << packet_data->header.sequenceNumber
+ << ", seq_no: " << packet_data->SequenceNumber()
<< ", timestamp: " << std::setw(10)
- << packet_data->header.timestamp
- << ", delta ts: " << std::setw(4) << delta_timestamp
- << ", size: " << std::setw(5) << packet_size_bytes
+ << packet_data->Timestamp() //
+ << ", delta ts: " << std::setw(4) << delta_timestamp //
+ << ", size: " << std::setw(5) << packet_size_bytes //
<< ", frame size: " << std::setw(3)
<< ops_state.current_frame_size_ms
<< ", buffer size: " << std::setw(4)
<< ops_state.current_buffer_size_ms << std::endl;
}
- last_packet_time_ms_ = std::make_optional<int>(time_now_ms);
- last_packet_timestamp_ =
- std::make_optional<uint32_t>(packet_data->header.timestamp);
+ last_packet_time_ms_ = time_now_ms;
+ last_packet_timestamp_ = packet_data->Timestamp();
}
if (input_->NextSetMinimumDelayInfo().has_value() &&
diff --git a/modules/audio_coding/neteq/tools/neteq_test.h b/modules/audio_coding/neteq/tools/neteq_test.h
index 8717cd0..e0cf777 100644
--- a/modules/audio_coding/neteq/tools/neteq_test.h
+++ b/modules/audio_coding/neteq/tools/neteq_test.h
@@ -27,6 +27,7 @@
#include "api/test/neteq_simulator.h"
#include "modules/audio_coding/neteq/tools/audio_sink.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "system_wrappers/include/clock.h"
namespace webrtc {
@@ -35,20 +36,19 @@
class NetEqTestErrorCallback {
public:
virtual ~NetEqTestErrorCallback() = default;
- virtual void OnInsertPacketError(const NetEqInput::PacketData& /* packet */) {
- }
+ virtual void OnInsertPacketError(const RtpPacketReceived& /* packet */) {}
virtual void OnGetAudioError() {}
};
class DefaultNetEqTestErrorCallback : public NetEqTestErrorCallback {
- void OnInsertPacketError(const NetEqInput::PacketData& packet) override;
+ void OnInsertPacketError(const RtpPacketReceived& packet) override;
void OnGetAudioError() override;
};
class NetEqPostInsertPacket {
public:
virtual ~NetEqPostInsertPacket() = default;
- virtual void AfterInsertPacket(const NetEqInput::PacketData& packet,
+ virtual void AfterInsertPacket(const RtpPacketReceived& packet,
NetEq* neteq) = 0;
};
diff --git a/modules/audio_coding/neteq/tools/neteq_test_factory.cc b/modules/audio_coding/neteq/tools/neteq_test_factory.cc
index ca4fb49..0901e09 100644
--- a/modules/audio_coding/neteq/tools/neteq_test_factory.cc
+++ b/modules/audio_coding/neteq/tools/neteq_test_factory.cc
@@ -90,16 +90,15 @@
explicit SsrcSwitchDetector(NetEqPostInsertPacket* other_callback)
: other_callback_(other_callback) {}
- void AfterInsertPacket(const NetEqInput::PacketData& packet,
+ void AfterInsertPacket(const RtpPacketReceived& packet,
NetEq* neteq) override {
- if (last_ssrc_ && packet.header.ssrc != *last_ssrc_) {
+ if (last_ssrc_ && packet.Ssrc() != *last_ssrc_) {
std::cout << "Changing streams from 0x" << std::hex << *last_ssrc_
- << " to 0x" << std::hex << packet.header.ssrc << std::dec
- << " (payload type "
- << static_cast<int>(packet.header.payloadType) << ")"
+ << " to 0x" << std::hex << packet.Ssrc() << std::dec
+ << " (payload type " << int{packet.PayloadType()} << ")"
<< std::endl;
}
- last_ssrc_ = packet.header.ssrc;
+ last_ssrc_ = packet.Ssrc();
if (other_callback_) {
other_callback_->AfterInsertPacket(packet, neteq);
}
diff --git a/test/fuzzers/BUILD.gn b/test/fuzzers/BUILD.gn
index 9d61ce6..ae891d2 100644
--- a/test/fuzzers/BUILD.gn
+++ b/test/fuzzers/BUILD.gn
@@ -451,10 +451,12 @@
"../../api/audio_codecs:audio_codecs_api",
"../../api/audio_codecs:builtin_audio_decoder_factory",
"../../api/neteq:neteq_api",
+ "../../api/units:time_delta",
"../../modules/audio_coding:neteq",
"../../modules/audio_coding:neteq_test_tools",
"../../modules/audio_coding:neteq_tools_minimal",
"../../modules/audio_coding:pcm16b",
+ "../../modules/rtp_rtcp:rtp_rtcp_format",
"../../rtc_base:checks",
"../../rtc_base:random",
"../../rtc_base:safe_conversions",
diff --git a/test/fuzzers/neteq_rtp_fuzzer.cc b/test/fuzzers/neteq_rtp_fuzzer.cc
index 734e734..cdfa59c 100644
--- a/test/fuzzers/neteq_rtp_fuzzer.cc
+++ b/test/fuzzers/neteq_rtp_fuzzer.cc
@@ -8,7 +8,6 @@
* be found in the AUTHORS file in the root of the source tree.
*/
-#include <algorithm>
#include <cmath>
#include <cstdint>
#include <cstring>
@@ -30,6 +29,7 @@
#include "modules/audio_coding/neteq/tools/neteq_input.h"
#include "modules/audio_coding/neteq/tools/neteq_test.h"
#include "modules/rtp_rtcp/source/byte_io.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/checks.h"
namespace webrtc {
@@ -80,7 +80,7 @@
}
std::optional<int64_t> NextPacketTime() const override {
- return packet_->time_ms;
+ return packet_->arrival_time().ms();
}
std::optional<int64_t> NextOutputEventTime() const override {
@@ -91,9 +91,9 @@
return input_->NextSetMinimumDelayInfo();
}
- std::unique_ptr<PacketData> PopPacket() override {
+ std::unique_ptr<RtpPacketReceived> PopPacket() override {
RTC_DCHECK(packet_);
- std::unique_ptr<PacketData> packet_to_return = std::move(packet_);
+ std::unique_ptr<RtpPacketReceived> packet_to_return = std::move(packet_);
packet_ = input_->PopPacket();
FuzzHeader();
MaybeFuzzPayload();
@@ -110,7 +110,9 @@
std::optional<RTPHeader> NextHeader() const override {
RTC_DCHECK(packet_);
- return packet_->header;
+ std::optional<RTPHeader> rtp_header(std::in_place);
+ packet_->GetHeader(&*rtp_header);
+ return rtp_header;
}
private:
@@ -122,18 +124,16 @@
}
RTC_DCHECK(packet_);
const size_t start_ix = data_ix_;
- packet_->header.payloadType =
- ByteReader<uint8_t>::ReadLittleEndian(&data_[data_ix_]);
- packet_->header.payloadType &= 0x7F;
+ packet_->SetPayloadType(
+ ByteReader<uint8_t>::ReadLittleEndian(&data_[data_ix_]) & 0x7F);
data_ix_ += sizeof(uint8_t);
- packet_->header.sequenceNumber =
- ByteReader<uint16_t>::ReadLittleEndian(&data_[data_ix_]);
+ packet_->SetSequenceNumber(
+ ByteReader<uint16_t>::ReadLittleEndian(&data_[data_ix_]));
data_ix_ += sizeof(uint16_t);
- packet_->header.timestamp =
- ByteReader<uint32_t>::ReadLittleEndian(&data_[data_ix_]);
+ packet_->SetTimestamp(
+ ByteReader<uint32_t>::ReadLittleEndian(&data_[data_ix_]));
data_ix_ += sizeof(uint32_t);
- packet_->header.ssrc =
- ByteReader<uint32_t>::ReadLittleEndian(&data_[data_ix_]);
+ packet_->SetSsrc(ByteReader<uint32_t>::ReadLittleEndian(&data_[data_ix_]));
data_ix_ += sizeof(uint32_t);
RTC_CHECK_EQ(data_ix_ - start_ix, kNumBytesToFuzz);
}
@@ -147,8 +147,8 @@
size_t bytes_to_fuzz = data_[data_ix_++];
// Restrict number of bytes to fuzz to 16; a reasonably low number enough to
- // cover a few RED headers. Also don't write outside the payload length.
- bytes_to_fuzz = std::min(bytes_to_fuzz % 16, packet_->payload.size());
+ // cover a few RED headers.
+ bytes_to_fuzz = bytes_to_fuzz % 16;
if (bytes_to_fuzz == 0)
return;
@@ -158,7 +158,7 @@
return;
}
- std::memcpy(packet_->payload.data(), &data_[data_ix_], bytes_to_fuzz);
+ packet_->SetPayload(MakeArrayView(&data_[data_ix_], bytes_to_fuzz));
data_ix_ += bytes_to_fuzz;
}
@@ -166,7 +166,7 @@
webrtc::ArrayView<const uint8_t> data_;
size_t data_ix_ = 0;
std::unique_ptr<EncodeNetEqInput> input_;
- std::unique_ptr<PacketData> packet_;
+ std::unique_ptr<RtpPacketReceived> packet_;
};
} // namespace
diff --git a/test/fuzzers/neteq_signal_fuzzer.cc b/test/fuzzers/neteq_signal_fuzzer.cc
index 1ba6d81..be64df5 100644
--- a/test/fuzzers/neteq_signal_fuzzer.cc
+++ b/test/fuzzers/neteq_signal_fuzzer.cc
@@ -25,11 +25,13 @@
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/neteq/neteq.h"
#include "api/rtp_headers.h"
+#include "api/units/time_delta.h"
#include "modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h"
#include "modules/audio_coding/neteq/tools/audio_checksum.h"
#include "modules/audio_coding/neteq/tools/encode_neteq_input.h"
#include "modules/audio_coding/neteq/tools/neteq_input.h"
#include "modules/audio_coding/neteq/tools/neteq_test.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "rtc_base/checks.h"
#include "rtc_base/numerics/safe_conversions.h"
#include "rtc_base/random.h"
@@ -103,7 +105,7 @@
}
std::optional<int64_t> NextPacketTime() const override {
- return packet_->time_ms;
+ return packet_->arrival_time().ms();
}
std::optional<int64_t> NextOutputEventTime() const override {
@@ -114,9 +116,9 @@
return input_->NextSetMinimumDelayInfo();
}
- std::unique_ptr<PacketData> PopPacket() override {
+ std::unique_ptr<RtpPacketReceived> PopPacket() override {
RTC_DCHECK(packet_);
- std::unique_ptr<PacketData> packet_to_return = std::move(packet_);
+ std::unique_ptr<RtpPacketReceived> packet_to_return = std::move(packet_);
do {
packet_ = input_->PopPacket();
// If the next value from the fuzzer input is 0, the packet is discarded
@@ -124,10 +126,12 @@
} while (fuzz_data_.CanReadBytes(1) && fuzz_data_.Read<uint8_t>() == 0);
if (fuzz_data_.CanReadBytes(1)) {
// Generate jitter by setting an offset for the arrival time.
- const int8_t arrival_time_offset_ms = fuzz_data_.Read<int8_t>();
+ const TimeDelta arrival_time_offset =
+ TimeDelta::Millis(fuzz_data_.Read<int8_t>());
// The arrival time can not be before the previous packets.
- packet_->time_ms = std::max(packet_to_return->time_ms,
- packet_->time_ms + arrival_time_offset_ms);
+ packet_->set_arrival_time(
+ std::max(packet_to_return->arrival_time(),
+ packet_->arrival_time() + arrival_time_offset));
} else {
// Mark that we are at the end of the test. However, the current packet is
// still valid (but it may not have been fuzzed as expected).
@@ -148,14 +152,16 @@
std::optional<RTPHeader> NextHeader() const override {
RTC_DCHECK(packet_);
- return packet_->header;
+ std::optional<RTPHeader> rtp_header(std::in_place);
+ packet_->GetHeader(&*rtp_header);
+ return rtp_header;
}
private:
bool ended_ = false;
FuzzDataHelper& fuzz_data_;
std::unique_ptr<EncodeNetEqInput> input_;
- std::unique_ptr<PacketData> packet_;
+ std::unique_ptr<RtpPacketReceived> packet_;
int64_t next_output_event_ms_ = 0;
int64_t output_event_period_ms_ = 10;
};