blob: e9d23362ef6a409f7fc87c03b9e2cbfa64e9058a [file] [log] [blame]
/*
* 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 RTC_TOOLS_RTP_GENERATOR_RTP_GENERATOR_H_
#define RTC_TOOLS_RTP_GENERATOR_RTP_GENERATOR_H_
#include <memory>
#include <string>
#include <vector>
#include "api/call/transport.h"
#include "api/media_types.h"
#include "api/rtc_event_log/rtc_event_log.h"
#include "api/task_queue/task_queue_factory.h"
#include "api/video/builtin_video_bitrate_allocator_factory.h"
#include "api/video_codecs/video_decoder_factory.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "call/call.h"
#include "call/rtp_config.h"
#include "call/video_send_stream.h"
#include "media/engine/webrtc_video_engine.h"
#include "test/frame_generator_capturer.h"
#include "test/rtp_file_reader.h"
#include "test/rtp_file_writer.h"
#include "video/config/video_encoder_config.h"
namespace webrtc {
// Specifies all the configurable options to pass to the corpus generator.
// If modified please update the JSON parser as well as all.
struct RtpGeneratorOptions {
struct VideoSendStreamConfig {
// The time to record the RtpDump for.
int duration_ms = 10000;
// The video resolution width.
int video_width = 640;
// The video resolution height.
int video_height = 480;
// The video fps.
int video_fps = 24;
// The number of squares to render.
int num_squares = 128;
// The individual RTP configuration.
RtpConfig rtp;
};
// Multiple senders can be active at once on an rtp channel.
std::vector<VideoSendStreamConfig> video_streams;
};
// Attempts to parse RtpGeneratorOptions from a JSON file. Any failures
// will result in absl::nullopt.
absl::optional<RtpGeneratorOptions> ParseRtpGeneratorOptionsFromFile(
const std::string& options_file);
// The RtpGenerator allows generating of corpus material intended to be
// used by fuzzers. It accepts a simple Json configuration file that allows the
// user to configure the codec, extensions and error correction mechanisms. It
// will then proceed to generate an rtpdump for the specified duration using
// that configuration that can be replayed by the video_replayer. The receiver
// configuration JSON will also be output and can be replayed as follows:
// ./rtp_generator --config_file sender_config --output_rtpdump my.rtpdump
// --output_config receiver_config.json
// ./video_replay --config_file receiver_config.json --output_file my.rtpdump
//
// It achieves this by creating a VideoStreamSender, configuring it as requested
// by the user and then intercepting all outgoing RTP packets and writing them
// to a file instead of out of the network. It then uses this sender
// configuration to generate a mirror receiver configuration that can be read by
// the video_replay program.
class RtpGenerator final : public webrtc::Transport {
public:
// Construct a new RtpGenerator using the specified options.
explicit RtpGenerator(const RtpGeneratorOptions& options);
RtpGenerator() = delete;
RtpGenerator(const RtpGenerator&) = delete;
RtpGenerator& operator=(const RtpGenerator&) = delete;
// Cleans up the VideoSendStream.
~RtpGenerator() override;
// Generates an rtp_dump that is written out to
void GenerateRtpDump(const std::string& rtp_dump_path);
private:
// webrtc::Transport implementation
// Captured RTP packets are written to the RTPDump file instead of over the
// network.
bool SendRtp(rtc::ArrayView<const uint8_t> packet,
const webrtc::PacketOptions& options) override;
// RTCP packets are ignored for now.
bool SendRtcp(rtc::ArrayView<const uint8_t> packet) override;
// Returns the maximum duration
int GetMaxDuration() const;
// Waits until all video streams have finished.
void WaitUntilAllVideoStreamsFinish();
// Converts packet data into an RtpPacket.
test::RtpPacket DataToRtpPacket(const uint8_t* packet, size_t packet_len);
const RtpGeneratorOptions options_;
std::unique_ptr<VideoEncoderFactory> video_encoder_factory_;
std::unique_ptr<VideoDecoderFactory> video_decoder_factory_;
std::unique_ptr<VideoBitrateAllocatorFactory>
video_bitrate_allocator_factory_;
std::unique_ptr<RtcEventLog> event_log_;
std::unique_ptr<Call> call_;
std::unique_ptr<test::RtpFileWriter> rtp_dump_writer_;
std::vector<std::unique_ptr<test::FrameGeneratorCapturer>> frame_generators_;
std::vector<VideoSendStream*> video_send_streams_;
std::vector<uint32_t> durations_ms_;
uint32_t start_ms_ = 0;
std::unique_ptr<TaskQueueFactory> task_queue_;
};
} // namespace webrtc
#endif // RTC_TOOLS_RTP_GENERATOR_RTP_GENERATOR_H_