Files
platform-external-webrtc/test/fuzzers/ulpfec_receiver_fuzzer.cc
Tommi 7fbab87b60 Report histograms in dtor of UlpfecReceiver.
The data that's used to report the histograms is owned by UlpfecReceiver
and moving the reporting there, simplifies things as configuration
changes happen in RtpVideoStreamReceiver2 (which currently require all
receive streams to be deleted+reconstructed).

Additional updates:
* Consistently using `Clock` for timestamps. Before there was
  a mix of Clock and rtc::TimeMillis.
* Update code to use Timestamp and TimeDelta.

Bug: none
Change-Id: I89ca28ec7067a49d6b357315ae733b04e7c5a2e3
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/271027
Reviewed-by: Rasmus Brandt <brandtr@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37729}
2022-08-10 07:51:35 +00:00

73 lines
2.5 KiB
C++

/*
* Copyright (c) 2017 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 <algorithm>
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "modules/rtp_rtcp/source/byte_io.h"
#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "modules/rtp_rtcp/source/ulpfec_receiver.h"
#include "test/fuzzers/fuzz_data_helper.h"
namespace webrtc {
namespace {
class DummyCallback : public RecoveredPacketReceiver {
void OnRecoveredPacket(const uint8_t* packet, size_t length) override {}
};
} // namespace
void FuzzOneInput(const uint8_t* data, size_t size) {
constexpr size_t kMinDataNeeded = 12;
if (size < kMinDataNeeded || size > 2000) {
return;
}
uint32_t ulpfec_ssrc = ByteReader<uint32_t>::ReadLittleEndian(data + 0);
uint16_t ulpfec_seq_num = ByteReader<uint16_t>::ReadLittleEndian(data + 4);
uint32_t media_ssrc = ByteReader<uint32_t>::ReadLittleEndian(data + 6);
uint16_t media_seq_num = ByteReader<uint16_t>::ReadLittleEndian(data + 10);
DummyCallback callback;
UlpfecReceiver receiver(ulpfec_ssrc, 0, &callback, {},
Clock::GetRealTimeClock());
test::FuzzDataHelper fuzz_data(rtc::MakeArrayView(data, size));
while (fuzz_data.CanReadBytes(kMinDataNeeded)) {
size_t packet_length = kRtpHeaderSize + fuzz_data.Read<uint8_t>();
auto raw_packet = fuzz_data.ReadByteArray(packet_length);
RtpPacketReceived parsed_packet;
if (!parsed_packet.Parse(raw_packet))
continue;
// Overwrite the fields for the sequence number and SSRC with
// consistent values for either a received UlpFEC packet or received media
// packet. (We're still relying on libfuzzer to manage to generate packet
// headers that interact together; this just ensures that we have two
// consistent streams).
if (fuzz_data.ReadOrDefaultValue<uint8_t>(0) % 2 == 0) {
// Simulate UlpFEC packet.
parsed_packet.SetSequenceNumber(ulpfec_seq_num++);
parsed_packet.SetSsrc(ulpfec_ssrc);
} else {
// Simulate media packet.
parsed_packet.SetSequenceNumber(media_seq_num++);
parsed_packet.SetSsrc(media_ssrc);
}
receiver.AddReceivedRedPacket(parsed_packet);
}
receiver.ProcessReceivedFec();
}
} // namespace webrtc