Bug Summary

File:root/firefox-clang/third_party/libwebrtc/modules/rtp_rtcp/source/rtcp_sender.h
Warning:line 49, column 7
Excessive padding in 'class webrtc::RTCPSender' (38 padding bytes, where 6 is optimal). Optimal fields order: recv_ssrc_callback_, schedule_next_rtcp_send_evaluation_, random_, transport_, report_interval_, receive_statistics_, remb_bitrate_, max_packet_size_, packet_type_counter_observer_, next_time_to_send_rtcp_, last_frame_capture_time_, csrcs_, loss_notification_, remb_ssrcs_, tmmbn_to_send_, cname_, env_, rtp_clock_rates_khz_, report_flags_, builders_, mutex_rtcp_sender_, send_ssrc_, method_, timestamp_offset_, last_rtp_timestamp_, remote_ssrc_, tmmbr_send_bps_, packet_oh_send_, nack_stats_, packet_type_counter_, is_rtp_sender_, audio_, sending_, sequence_number_fir_, xr_send_receiver_reference_time_enabled_, last_payload_type_, consider reordering the fields or adding explicit padding members

Annotated Source Code

Press '?' to see keyboard shortcuts

clang -cc1 -cc1 -triple x86_64-pc-linux-gnu -O2 -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name Unified_cpp_call_call_gn0.cpp -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=cplusplus -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -analyzer-config-compatibility-mode=true -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=all -relaxed-aliasing -ffp-contract=off -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/third_party/libwebrtc/call/call_gn -fcoverage-compilation-dir=/root/firefox-clang/obj-x86_64-pc-linux-gnu/third_party/libwebrtc/call/call_gn -resource-dir /usr/lib/llvm-23/lib/clang/23 -include /root/firefox-clang/config/gcc_hidden.h -include /root/firefox-clang/obj-x86_64-pc-linux-gnu/mozilla-config.h -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/stl_wrappers -D _GLIBCXX_ASSERTIONS=1 -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/system_wrappers -U _FORTIFY_SOURCE -D _FORTIFY_SOURCE=2 -D DEBUG=1 -D ABSL_ALLOCATOR_NOTHROW=1 -D PROTOBUF_ENABLE_DEBUG_LOGGING_MAY_LEAK_PII=0 -D RTC_DAV1D_IN_INTERNAL_DECODER_FACTORY -D RTC_ENABLE_VP9 -D WEBRTC_DEPRECATE_PLAN_B -D WEBRTC_ENABLE_PROTOBUF=0 -D WEBRTC_ENCODER_PSNR_STATS -D WEBRTC_LIBRARY_IMPL -D WEBRTC_MOZILLA_BUILD -D WEBRTC_NON_STATIC_TRACE_EVENT_HANDLERS=0 -D WEBRTC_STRICT_FIELD_TRIALS=0 -D WEBRTC_WITHOUT_RUST -D DYNAMIC_ANNOTATIONS_ENABLED=1 -D USE_AURA=1 -D USE_GLIB=1 -D USE_OZONE=1 -D USE_UDEV -D WEBRTC_LINUX -D WEBRTC_POSIX -D _FILE_OFFSET_BITS=64 -D _LARGEFILE64_SOURCE -D _LARGEFILE_SOURCE -D __STDC_CONSTANT_MACROS -D __STDC_FORMAT_MACROS -D WEBRTC_ENABLE_AVX2 -D _DEBUG -D _GNU_SOURCE -D MOZ_HAS_MOZGLUE -D MOZILLA_INTERNAL_API -D IMPL_LIBXUL -D MOZ_SUPPORT_LEAKCHECKING -D STATIC_EXPORTABLE_JS_API -I /root/firefox-clang/third_party/libwebrtc/call/call_gn -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/third_party/libwebrtc/call/call_gn -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include/libwebrtc_overrides -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/ipc/ipdl/_ipdlheaders -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/third_party/libwebrtc/gen -I /root/firefox-clang/ipc/chromium/src -I /root/firefox-clang/third_party/abseil-cpp -I /root/firefox-clang/third_party/libwebrtc -I /root/firefox-clang/tools/profiler/public -I /root/firefox-clang/obj-x86_64-pc-linux-gnu/dist/include -D MOZILLA_CLIENT -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/c++/16 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/x86_64-linux-gnu/c++/16 -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../include/c++/16/backward -internal-isystem /usr/lib/llvm-23/lib/clang/23/include -internal-isystem /usr/local/include -internal-isystem /usr/lib/gcc/x86_64-linux-gnu/16/../../../../x86_64-linux-gnu/include -internal-externc-isystem /usr/include/x86_64-linux-gnu -internal-externc-isystem /include -internal-externc-isystem /usr/include -Wno-error=pessimizing-move -Wno-error=large-by-value-copy=128 -Wno-error=implicit-int-float-conversion -Wno-error=thread-safety-analysis -Wno-error=tautological-type-limit-compare -Wno-invalid-offsetof -Wno-range-loop-analysis -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conversion -Wno-inline-new-delete -Wno-error=deprecated-declarations -Wno-error=array-bounds -Wno-error=free-nonheap-object -Wno-error=atomic-alignment -Wno-error=deprecated-builtins -Wno-psabi -Wno-error=builtin-macro-redefined -Wno-vla-cxx-extension -Wno-unknown-warning-option -Wno-character-conversion -std=gnu++20 -fdeprecated-macro -ferror-limit 19 -fstrict-flex-arrays=1 -stack-protector 2 -fstack-clash-protection -ftrivial-auto-var-init=pattern -fno-rtti -fgnuc-version=4.2.1 -fno-implicit-modules -fskip-odr-check-in-gmf -fno-sized-deallocation -fno-aligned-allocation -fdiagnostics-absolute-paths -vectorize-loops -vectorize-slp -analyzer-checker optin.performance.Padding -analyzer-output=html -analyzer-config stable-report-filename=true -mllvm -dwarf-linkage-names=Abstract -faddrsig -fdwarf2-cfi-asm -o /tmp/scan-build-2026-10-17-231001-351276-1 -x c++ Unified_cpp_call_call_gn0.cpp
1/*
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
12#define MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_
13
14#include <cstddef>
15#include <cstdint>
16#include <map>
17#include <memory>
18#include <optional>
19#include <set>
20#include <span>
21#include <string>
22#include <vector>
23
24#include "absl/functional/any_invocable.h"
25#include "absl/strings/string_view.h"
26#include "api/call/transport.h"
27#include "api/environment/environment.h"
28#include "api/rtp_headers.h"
29#include "api/units/data_rate.h"
30#include "api/units/time_delta.h"
31#include "api/units/timestamp.h"
32#include "modules/rtp_rtcp/include/receive_statistics.h"
33#include "modules/rtp_rtcp/include/rtcp_statistics.h"
34#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
35#include "modules/rtp_rtcp/source/rtcp_nack_stats.h"
36#include "modules/rtp_rtcp/source/rtcp_packet.h"
37#include "modules/rtp_rtcp/source/rtcp_packet/dlrr.h"
38#include "modules/rtp_rtcp/source/rtcp_packet/loss_notification.h"
39#include "modules/rtp_rtcp/source/rtcp_packet/report_block.h"
40#include "modules/rtp_rtcp/source/rtcp_packet/tmmb_item.h"
41#include "modules/rtp_rtcp/source/rtcp_receiver.h"
42#include "rtc_base/random.h"
43#include "rtc_base/synchronization/mutex.h"
44#include "rtc_base/thread_annotations.h"
45#include "system_wrappers/include/ntp_time.h"
46
47namespace webrtc {
48
49class RTCPSender final {
Excessive padding in 'class webrtc::RTCPSender' (38 padding bytes, where 6 is optimal). Optimal fields order: recv_ssrc_callback_, schedule_next_rtcp_send_evaluation_, random_, transport_, report_interval_, receive_statistics_, remb_bitrate_, max_packet_size_, packet_type_counter_observer_, next_time_to_send_rtcp_, last_frame_capture_time_, csrcs_, loss_notification_, remb_ssrcs_, tmmbn_to_send_, cname_, env_, rtp_clock_rates_khz_, report_flags_, builders_, mutex_rtcp_sender_, send_ssrc_, method_, timestamp_offset_, last_rtp_timestamp_, remote_ssrc_, tmmbr_send_bps_, packet_oh_send_, nack_stats_, packet_type_counter_, is_rtp_sender_, audio_, sending_, sequence_number_fir_, xr_send_receiver_reference_time_enabled_, last_payload_type_, consider reordering the fields or adding explicit padding members
50 public:
51 struct Configuration {
52 // True for a audio version of the RTP/RTCP module object false will create
53 // a video version.
54 bool audio = false;
55 // SSRC for sending media.
56 uint32_t local_media_ssrc = 0;
57 // Function for fetching SSRC for sending RTCP reports when this object
58 // belongs to a ModuleRtpRtcp2 that is not used for sending RTP.
59 absl::AnyInvocable<uint32_t() const> recv_ssrc_callback;
60 // FlexFec SSRC is fetched from `flexfec_sender`.
61
62 // Transport object that will be called when packets are ready to be sent
63 // out on the network.
64 Transport* outgoing_transport = nullptr;
65 // Estimate RTT as non-sender as described in
66 // https://tools.ietf.org/html/rfc3611#section-4.4 and #section-4.5
67 bool non_sender_rtt_measurement = false;
68
69 // Mandatory callback which is used by RTCPSender to schedule the next time
70 // to evaluate if RTCP should be sent by means of
71 // TimeToSendRTCPReport/SendRTCP. The RTCPSender client still needs to call
72 // TimeToSendRTCPReport/SendRTCP to actually get RTCP sent.
73 absl::AnyInvocable<void(TimeDelta)> schedule_next_rtcp_send_evaluation;
74
75 TimeDelta rtcp_report_interval;
76
77 // Initial RTCP status. Defaults to kOff to preserve backward compatibility
78 // with raw low-level RTCPSender tests and usages that assume the sender
79 // starts with RTCP disabled until explicitly configured.
80 RtcpMode rtcp_mode = RtcpMode::kOff;
81 ReceiveStatisticsProvider* receive_statistics = nullptr;
82 RtcpPacketTypeCounterObserver* rtcp_packet_type_counter_observer = nullptr;
83 };
84 struct FeedbackState {
85 FeedbackState();
86 FeedbackState(const FeedbackState&);
87 FeedbackState(FeedbackState&&);
88
89 ~FeedbackState();
90
91 uint32_t packets_sent;
92 size_t media_bytes_sent;
93 DataRate send_bitrate;
94
95 uint32_t remote_sr;
96 NtpTime last_rr;
97
98 std::vector<rtcp::ReceiveTimeInfo> last_xr_rtis;
99
100 // Used when generating TMMBR.
101 RTCPReceiver* receiver;
102 };
103
104 RTCPSender(const Environment& env, Configuration config);
105
106 RTCPSender() = delete;
107 RTCPSender(const RTCPSender&) = delete;
108 RTCPSender& operator=(const RTCPSender&) = delete;
109
110 ~RTCPSender();
111
112 RtcpMode Status() const RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
113 void SetRTCPStatus(RtcpMode method) RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
114
115 bool Sending() const RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
116 void SetSendingStatus(const FeedbackState& feedback_state,
117 bool enabled)
118 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_))); // combine the functions
119
120 void SetNonSenderRttMeasurement(bool enabled)
121 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
122
123 void SetTimestampOffset(uint32_t timestamp_offset)
124 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
125
126 void SetLastRtpTime(uint32_t rtp_timestamp,
127 std::optional<Timestamp> capture_time,
128 std::optional<int8_t> payload_type)
129 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
130
131 void SetRtpClockRate(int8_t payload_type, int rtp_clock_rate_hz)
132 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
133
134 uint32_t SSRC() const;
135
136 void SetRemoteSSRC(uint32_t ssrc) RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
137
138 int32_t SetCNAME(absl::string_view cName)
139 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
140
141 bool TimeToSendRTCPReport(bool send_keyframe_before_rtp = false) const
142 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
143
144 int32_t SendRTCP(const FeedbackState& feedback_state,
145 RTCPPacketType packetType,
146 std::span<const uint16_t> nacks = {})
147 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
148
149 int32_t SendLossNotification(const FeedbackState& feedback_state,
150 uint16_t last_decoded_seq_num,
151 uint16_t last_received_seq_num,
152 bool decodability_flag,
153 bool buffering_allowed)
154 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
155
156 void SetRemb(int64_t bitrate_bps, std::vector<uint32_t> ssrcs)
157 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
158
159 void UnsetRemb() RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
160
161 bool TMMBR() const RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
162
163 void SetMaxRtpPacketSize(size_t max_packet_size)
164 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
165
166 void SetTmmbn(std::vector<rtcp::TmmbItem> bounding_set)
167 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
168
169 void SetCsrcs(const std::vector<uint32_t>& csrcs)
170 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
171
172 void SetTargetBitrate(unsigned int target_bitrate)
173 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
174 void SendCombinedRtcpPacket(
175 std::vector<std::unique_ptr<rtcp::RtcpPacket>> rtcp_packets)
176 RTC_LOCKS_EXCLUDED(mutex_rtcp_sender_)__attribute__((locks_excluded(mutex_rtcp_sender_)));
177
178 private:
179 class RtcpContext;
180 class PacketSender;
181
182 uint32_t ComputeSsrc() const RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
183
184 std::optional<int32_t> ComputeCompoundRTCPPacket(
185 const FeedbackState& feedback_state,
186 RTCPPacketType packet_type,
187 std::span<const uint16_t> nacks,
188 PacketSender& sender) RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
189
190 TimeDelta ComputeTimeUntilNextReport(DataRate send_bitrate)
191 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
192
193 // Determine which RTCP messages should be sent and setup flags.
194 void PrepareReport(const FeedbackState& feedback_state)
195 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
196
197 std::vector<rtcp::ReportBlock> CreateReportBlocks(
198 const FeedbackState& feedback_state)
199 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
200
201 void BuildSR(const RtcpContext& context, PacketSender& sender)
202 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
203 void BuildRR(const RtcpContext& context, PacketSender& sender)
204 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
205 void BuildSDES(const RtcpContext& context, PacketSender& sender)
206 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
207 void BuildPLI(const RtcpContext& context, PacketSender& sender)
208 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
209 void BuildREMB(const RtcpContext& context, PacketSender& sender)
210 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
211 void BuildTMMBR(const RtcpContext& context, PacketSender& sender)
212 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
213 void BuildTMMBN(const RtcpContext& context, PacketSender& sender)
214 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
215 void BuildAPP(const RtcpContext& context, PacketSender& sender)
216 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
217 void BuildLossNotification(const RtcpContext& context, PacketSender& sender)
218 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
219 void BuildExtendedReports(const RtcpContext& context, PacketSender& sender)
220 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
221 void BuildBYE(const RtcpContext& context, PacketSender& sender)
222 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
223 void BuildFIR(const RtcpContext& context, PacketSender& sender)
224 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
225 void BuildNACK(const RtcpContext& context, PacketSender& sender)
226 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
227
228 // `duration` being TimeDelta::Zero() means schedule immediately.
229 void SetNextRtcpSendEvaluationDuration(TimeDelta duration)
230 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
231
232 const Environment env_;
233 const bool is_rtp_sender_;
234 const bool audio_;
235 // The SSRC used for sending when is_rtp_sender_ is true
236 // and sending_ is true.
237 const uint32_t send_ssrc_;
238 // The function used for getting the right SSRC to send from
239 // when the RTCPSender is used with a ModuleRtpRtcp that is not
240 // configured for sending RTP (is_rtp_sender_ is false).
241 absl::AnyInvocable<uint32_t() const> recv_ssrc_callback_;
242 Random random_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
243 RtcpMode method_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
244
245 Transport* const transport_;
246
247 const TimeDelta report_interval_;
248 absl::AnyInvocable<void(TimeDelta)> schedule_next_rtcp_send_evaluation_;
249
250 mutable Mutex mutex_rtcp_sender_;
251 bool sending_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
252
253 std::optional<Timestamp> next_time_to_send_rtcp_
254 RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
255
256 uint32_t timestamp_offset_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
257 uint32_t last_rtp_timestamp_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
258 std::optional<Timestamp> last_frame_capture_time_
259 RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
260 // SSRC that we receive on our RTP channel
261 uint32_t remote_ssrc_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
262 std::string cname_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
263
264 ReceiveStatisticsProvider* receive_statistics_
265 RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
266
267 // send CSRCs
268 std::vector<uint32_t> csrcs_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
269
270 // Full intra request
271 uint8_t sequence_number_fir_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
272
273 rtcp::LossNotification loss_notification_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
274
275 // REMB
276 int64_t remb_bitrate_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
277 std::vector<uint32_t> remb_ssrcs_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
278
279 std::vector<rtcp::TmmbItem> tmmbn_to_send_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
280 uint32_t tmmbr_send_bps_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
281 uint32_t packet_oh_send_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
282 size_t max_packet_size_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
283
284 // True if sending of XR Receiver reference time report is enabled.
285 bool xr_send_receiver_reference_time_enabled_
286 RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
287
288 RtcpPacketTypeCounterObserver* const packet_type_counter_observer_;
289 RtcpPacketTypeCounter packet_type_counter_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
290
291 RtcpNackStats nack_stats_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
292
293 std::map<int8_t, int> rtp_clock_rates_khz_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
294 int8_t last_payload_type_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
295
296 void SetFlag(uint32_t type, bool is_volatile)
297 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
298 bool IsFlagPresent(uint32_t type) const
299 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
300 bool ConsumeFlag(uint32_t type, bool forced = false)
301 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
302 bool AllVolatileFlagsConsumed() const
303 RTC_EXCLUSIVE_LOCKS_REQUIRED(mutex_rtcp_sender_)__attribute__((exclusive_locks_required(mutex_rtcp_sender_)));
304 struct ReportFlag {
305 ReportFlag(uint32_t type, bool is_volatile)
306 : type(type), is_volatile(is_volatile) {}
307 bool operator<(const ReportFlag& flag) const { return type < flag.type; }
308 bool operator==(const ReportFlag& flag) const { return type == flag.type; }
309 const uint32_t type;
310 const bool is_volatile;
311 };
312
313 std::set<ReportFlag> report_flags_ RTC_GUARDED_BY(mutex_rtcp_sender_)__attribute__((guarded_by(mutex_rtcp_sender_)));
314
315 typedef void (RTCPSender::*BuilderFunc)(const RtcpContext&, PacketSender&);
316 // Map from RTCPPacketType to builder.
317 std::map<uint32_t, BuilderFunc> builders_;
318};
319} // namespace webrtc
320
321#endif // MODULES_RTP_RTCP_SOURCE_RTCP_SENDER_H_