aboutsummaryrefslogtreecommitdiff
path: root/rtc_tools/video_replay.cc
diff options
context:
space:
mode:
Diffstat (limited to 'rtc_tools/video_replay.cc')
-rw-r--r--rtc_tools/video_replay.cc48
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;
}
}