summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/rtc_tools/rtp_generator/rtp_generator.h
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/rtc_tools/rtp_generator/rtp_generator.h')
-rw-r--r--third_party/libwebrtc/rtc_tools/rtp_generator/rtp_generator.h124
1 files changed, 124 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_tools/rtp_generator/rtp_generator.h b/third_party/libwebrtc/rtc_tools/rtp_generator/rtp_generator.h
new file mode 100644
index 0000000000..9a56522c33
--- /dev/null
+++ b/third_party/libwebrtc/rtc_tools/rtp_generator/rtp_generator.h
@@ -0,0 +1,124 @@
+/*
+ * 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(const uint8_t* packet,
+ size_t length,
+ const webrtc::PacketOptions& options) override;
+ // RTCP packets are ignored for now.
+ bool SendRtcp(const uint8_t* packet, size_t length) 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_