From bdf30c871ff25991c72ea81a573cc3d45de7e757 Mon Sep 17 00:00:00 2001 From: Per K Date: Wed, 18 Jan 2023 09:49:28 +0100 Subject: [PATCH] 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 Commit-Queue: Mirko Bonadei Reviewed-by: Mirko Bonadei Reviewed-by: Philip Eliasson Cr-Commit-Position: refs/heads/main@{#39136} --- rtc_tools/BUILD.gn | 2 ++ rtc_tools/video_replay.cc | 55 ++++++++++++++++++++++++++------------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/rtc_tools/BUILD.gn b/rtc_tools/BUILD.gn index 0d97b8593f..9b1f1fecda 100644 --- a/rtc_tools/BUILD.gn +++ b/rtc_tools/BUILD.gn @@ -247,10 +247,12 @@ if (!is_component_build) { 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 6fc9a98245..405948d8e0 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 @@ std::unique_ptr ConfigureFromFlags( 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 @@ class RtpReplayer final { private: void ReplayPackets() { + enum class Result { kOk, kUnknownSsrc, kParsingFailed }; int64_t replay_start_ms = -1; int num_packets = 0; std::map 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 @@ class RtpReplayer final { 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",