From 5f86437dbca2a94d13a513174661fefd71e9a9ff Mon Sep 17 00:00:00 2001 From: philipel Date: Mon, 4 Mar 2024 11:48:58 +0100 Subject: [PATCH] video_replay tool fix/update Change-Id: I188ed4c7cebc5cafb31e01a38e0460cde65fefa1 Bug: none Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/341800 Reviewed-by: Tomas Gunnarsson Reviewed-by: Mirko Bonadei Commit-Queue: Philip Eliasson Cr-Commit-Position: refs/heads/main@{#41926} --- rtc_tools/BUILD.gn | 1 + rtc_tools/DEPS | 1 + rtc_tools/video_replay.cc | 89 ++++++++++++++++++++++++--------------- 3 files changed, 58 insertions(+), 33 deletions(-) diff --git a/rtc_tools/BUILD.gn b/rtc_tools/BUILD.gn index 6fa2bdbce8..f14877de22 100644 --- a/rtc_tools/BUILD.gn +++ b/rtc_tools/BUILD.gn @@ -290,6 +290,7 @@ if (!is_component_build) { "../test/time_controller:time_controller", "//third_party/abseil-cpp/absl/flags:flag", "//third_party/abseil-cpp/absl/flags:parse", + "//third_party/abseil-cpp/absl/strings:strings", ] if (build_with_chromium) { # When building from Chromium, WebRTC's metrics and field trial diff --git a/rtc_tools/DEPS b/rtc_tools/DEPS index f62653d3ae..51a6eeb6dc 100644 --- a/rtc_tools/DEPS +++ b/rtc_tools/DEPS @@ -32,6 +32,7 @@ specific_include_rules = { ], ".*video_replay\.cc": [ "+modules/video_coding/utility/ivf_file_writer.h", + "+absl/strings/str_split.h", ], ".*video_encoder\.cc": [ "+modules/video_coding/codecs/av1/av1_svc_config.h", diff --git a/rtc_tools/video_replay.cc b/rtc_tools/video_replay.cc index 1a1d4fdb37..2dde05be34 100644 --- a/rtc_tools/video_replay.cc +++ b/rtc_tools/video_replay.cc @@ -16,6 +16,7 @@ #include "absl/flags/flag.h" #include "absl/flags/parse.h" +#include "absl/strings/str_split.h" #include "api/environment/environment.h" #include "api/environment/environment_factory.h" #include "api/field_trials.h" @@ -30,6 +31,7 @@ #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_dependency_descriptor_extension.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" @@ -102,14 +104,22 @@ ABSL_FLAG(uint32_t, webrtc::test::VideoTestConstants::kFlexfecSendSsrc, "Incoming FLEXFEC SSRC"); -// Flag for abs-send-time id. -ABSL_FLAG(int, abs_send_time_id, -1, "RTP extension ID for abs-send-time"); - -// Flag for transmission-offset id. -ABSL_FLAG(int, - transmission_offset_id, - -1, - "RTP extension ID for transmission-offset"); +ABSL_FLAG(std::vector, + ext_map, + {}, + "RTP extension to ID map in the format of EXT1:ID,EXT2:ID,EXT3:ID" + " Known extensions are:\n" + "TOFF - kTimestampOffsetUri\n" + "ABSSEND - kAbsSendTimeUri\n" + "ABSCAPT - kAbsoluteCaptureTimeUri\n" + "ROT - kVideoRotationUri\n" + "CONT - kVideoContentTypeUri\n" + "DD - kDependencyDescriptorUri\n" + "LALOC - kVideoLayersAllocationUri\n" + "TWCC - kTransportSequenceNumberUri\n" + "TWCC2 - kTransportSequenceNumberV2Uri\n" + "DELAY - kPlayoutDelayUri\n" + "COLOR - kColorSpaceUri\n"); // Flag for rtpdump input file. ABSL_FLAG(std::string, input_file, "", "input file"); @@ -179,10 +189,6 @@ bool ValidateOptionalPayloadType(int32_t payload_type) { return payload_type == -1 || ValidatePayloadType(payload_type); } -bool ValidateRtpHeaderExtensionId(int32_t extension_id) { - return extension_id >= -1 && extension_id < 15; -} - bool ValidateInputFilenameNotEmpty(const std::string& string) { return !string.empty(); } @@ -542,6 +548,35 @@ class RtpReplayer final { } private: + RtpHeaderExtensionMap GetExtensionMapFromFlags() { + const std::map kKnownExtensions = { + {"TOFF", RtpExtension::kTimestampOffsetUri}, + {"ABSSEND", RtpExtension::kAbsSendTimeUri}, + {"ABSCAPT", RtpExtension::kAbsoluteCaptureTimeUri}, + {"ROT", RtpExtension::kVideoRotationUri}, + {"CONT", RtpExtension::kVideoContentTypeUri}, + {"DD", RtpExtension::kDependencyDescriptorUri}, + {"LALOC", RtpExtension::kVideoLayersAllocationUri}, + {"TWCC", RtpExtension::kTransportSequenceNumberUri}, + {"TWCC2", RtpExtension::kTransportSequenceNumberV2Uri}, + {"DELAY", RtpExtension::kPlayoutDelayUri}, + {"COLOR", RtpExtension::kColorSpaceUri}, + }; + + RtpHeaderExtensionMap res; + for (const std::string& extension : absl::GetFlag(FLAGS_ext_map)) { + std::pair ext = absl::StrSplit(extension, ':'); + if (auto it = kKnownExtensions.find(ext.first); + it != kKnownExtensions.end()) { + res.RegisterByUri(std::stoi(ext.second), it->second); + } else { + RTC_DCHECK_NOTREACHED() << "Unknown extension \"" << ext.first << "\""; + } + } + + return res; + } + void ReplayPackets() { enum class Result { kOk, kUnknownSsrc, kParsingFailed }; int64_t replay_start_ms = -1; @@ -551,15 +586,7 @@ class RtpReplayer final { 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); - } + RtpHeaderExtensionMap extensions = GetExtensionMapFromFlags(); while (true) { int64_t now_ms = CurrentTimeMs(); @@ -603,15 +630,15 @@ class RtpReplayer final { Timestamp::Millis(CurrentTimeMs())); if (!received_packet.Parse(std::move(packet_buffer))) { result = Result::kParsingFailed; - return; + } else { + 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; + }); } - 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)); @@ -693,10 +720,6 @@ int main(int argc, char* argv[]) { ValidateOptionalPayloadType(absl::GetFlag(FLAGS_ulpfec_payload_type))); RTC_CHECK( ValidateOptionalPayloadType(absl::GetFlag(FLAGS_flexfec_payload_type))); - RTC_CHECK( - ValidateRtpHeaderExtensionId(absl::GetFlag(FLAGS_abs_send_time_id))); - RTC_CHECK(ValidateRtpHeaderExtensionId( - absl::GetFlag(FLAGS_transmission_offset_id))); RTC_CHECK(ValidateInputFilenameNotEmpty(absl::GetFlag(FLAGS_input_file))); RTC_CHECK_GE(absl::GetFlag(FLAGS_extend_run_time_duration), 0);