/* * 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 #include #include #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_config.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 "rtc_base/constructor_magic.h" #include "test/frame_generator_capturer.h" #include "test/rtp_file_reader.h" #include "test/rtp_file_writer.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 video_streams; }; // Attempts to parse RtpGeneratorOptions from a JSON file. Any failures // will result in absl::nullopt. absl::optional 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); // 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 video_encoder_factory_; std::unique_ptr video_decoder_factory_; std::unique_ptr video_bitrate_allocator_factory_; std::unique_ptr event_log_; std::unique_ptr call_; std::unique_ptr rtp_dump_writer_; std::vector> frame_generators_; std::vector video_send_streams_; std::vector durations_ms_; uint32_t start_ms_ = 0; std::unique_ptr task_queue_; // This object cannot be copied. RTC_DISALLOW_IMPLICIT_CONSTRUCTORS(RtpGenerator); }; } // namespace webrtc #endif // RTC_TOOLS_RTP_GENERATOR_RTP_GENERATOR_H_