diff options
Diffstat (limited to 'rtc_tools/video_replay.cc')
-rw-r--r-- | rtc_tools/video_replay.cc | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/rtc_tools/video_replay.cc b/rtc_tools/video_replay.cc index 1faad28ff1..d96c7be410 100644 --- a/rtc_tools/video_replay.cc +++ b/rtc_tools/video_replay.cc @@ -25,6 +25,7 @@ #include "call/call.h" #include "common_video/libyuv/include/webrtc_libyuv.h" #include "media/engine/internal_decoder_factory.h" +#include "modules/rtp_rtcp/source/rtp_packet.h" #include "modules/video_coding/utility/ivf_file_writer.h" #include "rtc_base/checks.h" #include "rtc_base/string_to_number.h" @@ -39,7 +40,6 @@ #include "test/gtest.h" #include "test/null_transport.h" #include "test/rtp_file_reader.h" -#include "test/rtp_header_parser.h" #include "test/run_loop.h" #include "test/run_test.h" #include "test/test_video_capturer.h" @@ -119,6 +119,18 @@ ABSL_FLAG(std::string, decoder_ivf_filename, "", "Decoder ivf output file"); // Flag for video codec. ABSL_FLAG(std::string, codec, "VP8", "Video codec"); +// Flags for rtp start and stop timestamp. +ABSL_FLAG(uint32_t, + start_timestamp, + 0, + "RTP start timestamp, packets with smaller timestamp will be ignored " + "(no wraparound)"); +ABSL_FLAG(uint32_t, + stop_timestamp, + 4294967295, + "RTP stop timestamp, packets with larger timestamp will be ignored " + "(no wraparound)"); + namespace { static bool ValidatePayloadType(int32_t payload_type) { @@ -520,6 +532,8 @@ class RtpReplayer final { int num_packets = 0; std::map<uint32_t, int> unknown_packets; rtc::Event event(/*manual_reset=*/false, /*initially_signalled=*/false); + uint32_t start_timestamp = absl::GetFlag(FLAGS_start_timestamp); + uint32_t stop_timestamp = absl::GetFlag(FLAGS_stop_timestamp); while (true) { int64_t now_ms = rtc::TimeMillis(); if (replay_start_ms == -1) { @@ -530,6 +544,13 @@ class RtpReplayer final { if (!rtp_reader->NextPacket(&packet)) { break; } + rtc::CopyOnWriteBuffer packet_buffer(packet.data, packet.length); + RtpPacket header; + header.Parse(packet_buffer); + if (header.Timestamp() < start_timestamp || + header.Timestamp() > stop_timestamp) { + continue; + } int64_t deliver_in_ms = replay_start_ms + packet.time_ms - now_ms; if (deliver_in_ms > 0) { @@ -539,10 +560,9 @@ class RtpReplayer final { ++num_packets; PacketReceiver::DeliveryStatus result = PacketReceiver::DELIVERY_OK; worker_thread->PostTask(ToQueuedTask([&]() { - result = call->Receiver()->DeliverPacket( - webrtc::MediaType::VIDEO, - rtc::CopyOnWriteBuffer(packet.data, packet.length), - /* packet_time_us */ -1); + result = call->Receiver()->DeliverPacket(webrtc::MediaType::VIDEO, + std::move(packet_buffer), + /* packet_time_us */ -1); event.Set(); })); event.Wait(/*give_up_after_ms=*/10000); @@ -550,25 +570,17 @@ class RtpReplayer final { case PacketReceiver::DELIVERY_OK: break; case PacketReceiver::DELIVERY_UNKNOWN_SSRC: { - RTPHeader header; - std::unique_ptr<RtpHeaderParser> parser( - RtpHeaderParser::CreateForTest()); - parser->Parse(packet.data, packet.length, &header); - if (unknown_packets[header.ssrc] == 0) - fprintf(stderr, "Unknown SSRC: %u!\n", header.ssrc); - ++unknown_packets[header.ssrc]; + if (unknown_packets[header.Ssrc()] == 0) + fprintf(stderr, "Unknown SSRC: %u!\n", header.Ssrc()); + ++unknown_packets[header.Ssrc()]; break; } case PacketReceiver::DELIVERY_PACKET_ERROR: { fprintf(stderr, "Packet error, corrupt packets or incorrect setup?\n"); - RTPHeader header; - std::unique_ptr<RtpHeaderParser> parser( - RtpHeaderParser::CreateForTest()); - parser->Parse(packet.data, packet.length, &header); fprintf(stderr, "Packet len=%zu pt=%u seq=%u ts=%u ssrc=0x%8x\n", - packet.length, header.payloadType, header.sequenceNumber, - header.timestamp, header.ssrc); + packet.length, header.PayloadType(), header.SequenceNumber(), + header.Timestamp(), header.Ssrc()); break; } } |