Files
platform-external-webrtc/test/fuzzers/utils/rtp_replayer.h
Kuang-che Wu ce9da1636a Use FakeRenderer when fuzzing
Do not fuzz with real renderer because it is merely frame copying and
doesn't exercise different control flows. This CL also improved fuzzing
performance and fixed a memory leak.

Bug: chromium:952606, chromium:1009077, chromium:1009073
Change-Id: I77c6f2581db82bfd95edb18e5f0e541a94c78208
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/156620
Commit-Queue: Benjamin Wright <benwright@webrtc.org>
Reviewed-by: Benjamin Wright <benwright@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#29522}
2019-10-17 18:44:03 +00:00

90 lines
3.2 KiB
C++

/*
* Copyright (c) 2019 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.
*/
#ifndef TEST_FUZZERS_UTILS_RTP_REPLAYER_H_
#define TEST_FUZZERS_UTILS_RTP_REPLAYER_H_
#include <stdio.h>
#include <map>
#include <memory>
#include <string>
#include <vector>
#include "api/rtc_event_log/rtc_event_log.h"
#include "api/test/video/function_video_decoder_factory.h"
#include "api/video_codecs/video_decoder.h"
#include "call/call.h"
#include "media/engine/internal_decoder_factory.h"
#include "rtc_base/fake_clock.h"
#include "rtc_base/time_utils.h"
#include "test/null_transport.h"
#include "test/rtp_file_reader.h"
#include "test/test_video_capturer.h"
namespace webrtc {
namespace test {
// The RtpReplayer is a utility for fuzzing the RTP/RTCP receiver stack in
// WebRTC. It achieves this by accepting a set of Receiver configurations and
// an RtpDump (consisting of both RTP and RTCP packets). The |rtp_dump| is
// passed in as a buffer to allow simple mutation fuzzing directly on the dump.
class RtpReplayer final {
public:
// Holds all the important stream information required to emulate the WebRTC
// rtp receival code path.
struct StreamState {
test::NullTransport transport;
std::vector<std::unique_ptr<rtc::VideoSinkInterface<VideoFrame>>> sinks;
std::vector<VideoReceiveStream*> receive_streams;
std::unique_ptr<VideoDecoderFactory> decoder_factory;
};
// Construct an RtpReplayer from a JSON replay configuration file.
static void Replay(const std::string& replay_config_filepath,
const uint8_t* rtp_dump_data,
size_t rtp_dump_size);
// Construct an RtpReplayer from a set of VideoReceiveStream::Configs. Note
// the stream_state.transport must be set for each receiver stream.
static void Replay(
std::unique_ptr<StreamState> stream_state,
std::vector<VideoReceiveStream::Config> receive_stream_config,
const uint8_t* rtp_dump_data,
size_t rtp_dump_size);
private:
// Reads the replay configuration from Json.
static std::vector<VideoReceiveStream::Config> ReadConfigFromFile(
const std::string& replay_config,
Transport* transport);
// Configures the stream state based on the receiver configurations.
static void SetupVideoStreams(
std::vector<VideoReceiveStream::Config>* receive_stream_configs,
StreamState* stream_state,
Call* call);
// Creates a new RtpReader which can read the RtpDump
static std::unique_ptr<test::RtpFileReader> CreateRtpReader(
const uint8_t* rtp_dump_data,
size_t rtp_dump_size);
// Replays each packet to from the RtpDump.
static void ReplayPackets(rtc::FakeClock* clock,
Call* call,
test::RtpFileReader* rtp_reader);
}; // class RtpReplayer
} // namespace test
} // namespace webrtc
#endif // TEST_FUZZERS_UTILS_RTP_REPLAYER_H_