Ensure VideoRtpReplayer use new PacketReceiver::DeliverRtp packet.
Receivers no longer need to set extensions in the configuration. That field will be removed in a follow up.
Tested with:
video_loopback --rtp_dump_name="./my.rtpdump" --duration=10
video_replay --input_file=./my.rtpdump
Bug: webrtc:14795
Change-Id: I952cd487cb2f3be8be01a90f6a2312f1fef5d93e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/290995
Auto-Submit: Per Kjellander <perkj@webrtc.org>
Commit-Queue: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#39136}
diff --git a/rtc_tools/BUILD.gn b/rtc_tools/BUILD.gn
index 0d97b85..9b1f1fe 100644
--- a/rtc_tools/BUILD.gn
+++ b/rtc_tools/BUILD.gn
@@ -247,10 +247,12 @@
sources = [ "video_replay.cc" ]
deps = [
"../api:field_trials",
+ "../api:rtp_parameters",
"../api/rtc_event_log",
"../api/task_queue:default_task_queue_factory",
"../api/test/video:function_video_factory",
"../api/transport:field_trial_based_config",
+ "../api/units:timestamp",
"../api/video:video_frame",
"../api/video_codecs:video_codecs_api",
"../call",
diff --git a/rtc_tools/video_replay.cc b/rtc_tools/video_replay.cc
index 6fc9a98..405948d 100644
--- a/rtc_tools/video_replay.cc
+++ b/rtc_tools/video_replay.cc
@@ -17,16 +17,20 @@
#include "absl/flags/flag.h"
#include "absl/flags/parse.h"
#include "api/field_trials.h"
+#include "api/media_types.h"
#include "api/rtc_event_log/rtc_event_log.h"
#include "api/task_queue/default_task_queue_factory.h"
#include "api/test/video/function_video_decoder_factory.h"
#include "api/transport/field_trial_based_config.h"
+#include "api/units/timestamp.h"
#include "api/video/video_codec_type.h"
#include "api/video_codecs/video_decoder.h"
#include "call/call.h"
#include "common_video/libyuv/include/webrtc_libyuv.h"
#include "media/engine/internal_decoder_factory.h"
+#include "modules/rtp_rtcp/include/rtp_header_extension_map.h"
#include "modules/rtp_rtcp/source/rtp_packet.h"
+#include "modules/rtp_rtcp/source/rtp_packet_received.h"
#include "modules/rtp_rtcp/source/rtp_util.h"
#include "modules/video_coding/utility/ivf_file_writer.h"
#include "rtc_base/checks.h"
@@ -401,15 +405,6 @@
stream_state->flexfec_streams.push_back(flexfec_stream);
}
- if (absl::GetFlag(FLAGS_transmission_offset_id) != -1) {
- receive_config.rtp.extensions.push_back(
- RtpExtension(RtpExtension::kTimestampOffsetUri,
- absl::GetFlag(FLAGS_transmission_offset_id)));
- }
- if (absl::GetFlag(FLAGS_abs_send_time_id) != -1) {
- receive_config.rtp.extensions.push_back(RtpExtension(
- RtpExtension::kAbsSendTimeUri, absl::GetFlag(FLAGS_abs_send_time_id)));
- }
receive_config.renderer = stream_state->sinks.back().get();
// Setup the receiving stream
@@ -554,12 +549,24 @@
private:
void ReplayPackets() {
+ enum class Result { kOk, kUnknownSsrc, kParsingFailed };
int64_t replay_start_ms = -1;
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);
+
+ RtpHeaderExtensionMap extensions;
+ if (absl::GetFlag(FLAGS_transmission_offset_id) != -1) {
+ extensions.RegisterByUri(absl::GetFlag(FLAGS_transmission_offset_id),
+ RtpExtension::kTimestampOffsetUri);
+ }
+ if (absl::GetFlag(FLAGS_abs_send_time_id) != -1) {
+ extensions.RegisterByUri(absl::GetFlag(FLAGS_abs_send_time_id),
+ RtpExtension::kAbsSendTimeUri);
+ }
+
while (true) {
int64_t now_ms = CurrentTimeMs();
if (replay_start_ms == -1) {
@@ -592,27 +599,39 @@
SleepOrAdvanceTime(deliver_in_ms);
++num_packets;
- PacketReceiver::DeliveryStatus result = PacketReceiver::DELIVERY_OK;
+
+ Result result = Result::kOk;
worker_thread_->PostTask([&]() {
- MediaType media_type =
- IsRtcpPacket(packet_buffer) ? MediaType::ANY : MediaType::VIDEO;
- result = call_->Receiver()->DeliverPacket(media_type,
- std::move(packet_buffer),
- /* packet_time_us */ -1);
+ if (IsRtcpPacket(packet_buffer)) {
+ call_->Receiver()->DeliverRtcpPacket(std::move(packet_buffer));
+ }
+ RtpPacketReceived received_packet(&extensions,
+ Timestamp::Millis(CurrentTimeMs()));
+ if (!received_packet.Parse(std::move(packet_buffer))) {
+ result = Result::kParsingFailed;
+ return;
+ }
+ call_->Receiver()->DeliverRtpPacket(
+ MediaType::VIDEO, received_packet,
+ [&result](const RtpPacketReceived& parsed_packet) -> bool {
+ result = Result::kUnknownSsrc;
+ // No point in trying to demux again.
+ return false;
+ });
event.Set();
});
event.Wait(/*give_up_after=*/TimeDelta::Seconds(10));
switch (result) {
- case PacketReceiver::DELIVERY_OK:
+ case Result::kOk:
break;
- case PacketReceiver::DELIVERY_UNKNOWN_SSRC: {
+ case Result::kUnknownSsrc: {
if (unknown_packets[header.Ssrc()] == 0)
fprintf(stderr, "Unknown SSRC: %u!\n", header.Ssrc());
++unknown_packets[header.Ssrc()];
break;
}
- case PacketReceiver::DELIVERY_PACKET_ERROR: {
+ case Result::kParsingFailed: {
fprintf(stderr,
"Packet error, corrupt packets or incorrect setup?\n");
fprintf(stderr, "Packet len=%zu pt=%u seq=%u ts=%u ssrc=0x%8x\n",