mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-20 00:57:49 +01:00

This is a reland of49734dc0fa
Patchset 2 contains a fix for the fuzzer set up. Since we now parse an RtpPacket out of the fuzzer data, the header needs to be correct, otherwise we fail before even reaching the FEC code that we actually want to test. Bug: webrtc:11340, chromium:1052323, chromium:1055974 TBR=stefan@webrtc.org Original change's description: > Reland "Refactors UlpFec and FlexFec to use a common interface." > > This is a reland of11af1d7444
> > Original change's description: > > Refactors UlpFec and FlexFec to use a common interface. > > > > The new VideoFecGenerator is now injected into RtpSenderVideo, > > and generalizes the usage. > > This also prepares for being able to genera FEC in the RTP egress > > module. > > > > Bug: webrtc:11340 > > Change-Id: I8aa873129b2fb4131eb3399ee88f6ea2747155a3 > > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168347 > > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > > Reviewed-by: Sebastian Jansson <srte@webrtc.org> > > Reviewed-by: Rasmus Brandt <brandtr@webrtc.org> > > Commit-Queue: Erik Språng <sprang@webrtc.org> > > Cr-Commit-Position: refs/heads/master@{#30515} > > Bug: webrtc:11340, chromium:1052323 > Change-Id: Id646047365f1c46cca9e6f3e8eefa5151207b4a0 > Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/168608 > Commit-Queue: Erik Språng <sprang@webrtc.org> > Reviewed-by: Stefan Holmer <stefan@webrtc.org> > Cr-Commit-Position: refs/heads/master@{#30593} Bug: webrtc:11340, chromium:1052323 Change-Id: Ib8925f44e2edfcfeadc95c845c3bfc23822604ed Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/169222 Commit-Queue: Erik Språng <sprang@webrtc.org> Reviewed-by: Ilya Nikolaevskiy <ilnik@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30724}
70 lines
2.6 KiB
C++
70 lines
2.6 KiB
C++
/*
|
|
* Copyright (c) 2015 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 <memory>
|
|
|
|
#include "modules/include/module_common_types_public.h"
|
|
#include "modules/rtp_rtcp/source/byte_io.h"
|
|
#include "modules/rtp_rtcp/source/fec_test_helper.h"
|
|
#include "modules/rtp_rtcp/source/ulpfec_generator.h"
|
|
#include "rtc_base/checks.h"
|
|
#include "rtc_base/copy_on_write_buffer.h"
|
|
#include "system_wrappers/include/clock.h"
|
|
|
|
namespace webrtc {
|
|
|
|
namespace {
|
|
constexpr uint8_t kFecPayloadType = 96;
|
|
constexpr uint8_t kRedPayloadType = 97;
|
|
} // namespace
|
|
|
|
void FuzzOneInput(const uint8_t* data, size_t size) {
|
|
SimulatedClock clock(1);
|
|
UlpfecGenerator generator(kRedPayloadType, kFecPayloadType, &clock);
|
|
size_t i = 0;
|
|
if (size < 4)
|
|
return;
|
|
FecProtectionParams params = {
|
|
data[i++] % 128, static_cast<int>(data[i++] % 10), kFecMaskBursty};
|
|
generator.SetProtectionParameters(params, params);
|
|
uint16_t seq_num = data[i++];
|
|
uint16_t prev_seq_num = 0;
|
|
while (i + 3 < size) {
|
|
size_t rtp_header_length = data[i++] % 10 + 12;
|
|
size_t payload_size = data[i++] % 10;
|
|
if (i + payload_size + rtp_header_length + 2 > size)
|
|
break;
|
|
rtc::CopyOnWriteBuffer packet(&data[i], payload_size + rtp_header_length);
|
|
packet.EnsureCapacity(IP_PACKET_SIZE);
|
|
// Write a valid parsable header (version = 2, no padding, no extensions,
|
|
// no CSRCs).
|
|
ByteWriter<uint8_t>::WriteBigEndian(&packet[0], 2 << 6);
|
|
// Make sure sequence numbers are increasing.
|
|
ByteWriter<uint16_t>::WriteBigEndian(&packet[2], seq_num++);
|
|
i += payload_size + rtp_header_length;
|
|
const bool protect = data[i++] % 2 == 1;
|
|
|
|
// Check the sequence numbers are monotonic. In rare case the packets number
|
|
// may loop around and in the same FEC-protected group the packet sequence
|
|
// number became out of order.
|
|
if (protect && IsNewerSequenceNumber(seq_num, prev_seq_num) &&
|
|
seq_num < prev_seq_num + kUlpfecMaxMediaPackets) {
|
|
RtpPacketToSend rtp_packet(nullptr);
|
|
// Check that we actually have a parsable packet, we want to fuzz FEC
|
|
// logic, not RTP header parsing.
|
|
RTC_CHECK(rtp_packet.Parse(packet));
|
|
generator.AddPacketAndGenerateFec(rtp_packet);
|
|
prev_seq_num = seq_num;
|
|
}
|
|
|
|
generator.GetFecPackets();
|
|
}
|
|
}
|
|
} // namespace webrtc
|