| /* | |
| * Copyright (c) 2026 The WebRTC project authors. All Rights Reserved. | |
| * | |
| * Use of this source code is governed by a BSD-style license | |
| * that can be found in the LICENSE file in the root of the source | |
| * tree. An additional intellectual property rights grant can be found | |
| * in the file PATENTS. All contributing project authors may | |
| * be found in the AUTHORS file in the root of the source tree. | |
| */ | |
| #include "video/timing/simulator/log_classifiers.h" | |
| #include <optional> | |
| #include "logging/rtc_event_log/events/logged_rtp_rtcp.h" | |
| #include "logging/rtc_event_log/rtc_event_log_parser.h" | |
| #include "rtc_base/checks.h" | |
| namespace webrtc::video_timing_simulator { | |
| std::optional<RtxOsnLoggingStatus> GetRtxOsnLoggingStatus( | |
| const ParsedRtcEventLog& parsed_log) { | |
| // Logs without video RTX packets are undeterminable. | |
| bool log_contained_video_rtx_packets = false; | |
| // Boolean accumulators for the presence of `rtx_original_sequence_number` | |
| // for the video RTX packets across the log. | |
| bool all_presence = true; | |
| bool any_presence = false; | |
| // Loop over all video RTX streams, and then over packets within the streams. | |
| for (const ParsedRtcEventLog::LoggedRtpStreamIncoming& stream : | |
| parsed_log.incoming_rtp_packets_by_ssrc()) { | |
| // Check for video. | |
| if (!parsed_log.incoming_video_ssrcs().contains(stream.ssrc)) { | |
| continue; | |
| } | |
| // Check for RTX. | |
| if (!parsed_log.incoming_rtx_ssrcs().contains(stream.ssrc)) { | |
| continue; | |
| } | |
| // Check all packets for this video RTX stream. | |
| for (const LoggedRtpPacketIncoming& incoming_packet : | |
| stream.incoming_packets) { | |
| log_contained_video_rtx_packets = true; | |
| bool presence = | |
| incoming_packet.rtp.rtx_original_sequence_number.has_value(); | |
| all_presence = all_presence && presence; | |
| any_presence = any_presence || presence; | |
| } | |
| } | |
| if (!log_contained_video_rtx_packets) { | |
| return std::nullopt; | |
| } | |
| if (all_presence) { | |
| RTC_DCHECK(any_presence); | |
| return RtxOsnLoggingStatus::kAllRtxOsnLogged; | |
| } | |
| if (any_presence) { | |
| return RtxOsnLoggingStatus::kSomeRtxOsnLogged; | |
| } | |
| return RtxOsnLoggingStatus::kNoRtxOsnLogged; | |
| } | |
| } // namespace webrtc::video_timing_simulator |