Bug 1880804 [wpt PR 44645] - Implement constructor in RTCEncodedVideoFrame, a=testonly
[gecko.git] / third_party / libwebrtc / moz-patch-stack / 0070.patch
bloba63b0af9c2cf80a55a8dab6ac8b68fbb3e51147d
1 From: Andreas Pehrson <apehrson@mozilla.com>
2 Date: Thu, 6 Jan 2022 00:16:00 +0000
3 Subject: Bug 1748458 - Add TRACE_EVENTs for dropped frames and packets for
4 received video. r=bwc
6 This lets us see in the profiler how many received frames and packets we decide
7 to drop and the reasons why.
9 Differential Revision: https://phabricator.services.mozilla.com/D135062
10 Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/08e252da94c4752eccfd845eef13d8517953cc6a
12 Also includes:
14 Bug 1804288 - (fix-de7ae5755b) reimplement Bug 1748458 - Add TRACE_EVENTs for dropped frames and packets for received video. r=pehrsons
16 Differential Revision: https://phabricator.services.mozilla.com/D163960
17 Mercurial Revision: https://hg.mozilla.org/mozilla-central/rev/8e9a326a99cd5eaa6e447ff57c01ad9d79a09744
18 ---
19 api/video/frame_buffer.cc | 33 +++++++++++++++++++++++++
20 video/receive_statistics_proxy.cc | 11 +++++++++
21 video/rtp_video_stream_receiver2.cc | 4 +++
22 video/video_stream_buffer_controller.cc | 7 ++++++
23 4 files changed, 55 insertions(+)
25 diff --git a/api/video/frame_buffer.cc b/api/video/frame_buffer.cc
26 index 09ca53ac94..8d61025912 100644
27 --- a/api/video/frame_buffer.cc
28 +++ b/api/video/frame_buffer.cc
29 @@ -16,6 +16,7 @@
30 #include "absl/container/inlined_vector.h"
31 #include "rtc_base/logging.h"
32 #include "rtc_base/numerics/sequence_number_util.h"
33 +#include "rtc_base/trace_event.h"
35 namespace webrtc {
36 namespace {
37 @@ -68,7 +69,12 @@ FrameBuffer::FrameBuffer(int max_size,
38 decoded_frame_history_(max_decode_history) {}
40 bool FrameBuffer::InsertFrame(std::unique_ptr<EncodedFrame> frame) {
41 + const uint32_t ssrc =
42 + frame->PacketInfos().empty() ? 0 : frame->PacketInfos()[0].ssrc();
43 if (!ValidReferences(*frame)) {
44 + TRACE_EVENT2("webrtc",
45 + "FrameBuffer::InsertFrame Frame dropped (Invalid references)",
46 + "remote_ssrc", ssrc, "frame_id", frame->Id());
47 RTC_DLOG(LS_WARNING) << "Frame " << frame->Id()
48 << " has invalid references, dropping frame.";
49 return false;
50 @@ -78,23 +84,35 @@ bool FrameBuffer::InsertFrame(std::unique_ptr<EncodedFrame> frame) {
51 if (legacy_frame_id_jump_behavior_ && frame->is_keyframe() &&
52 AheadOf(frame->RtpTimestamp(),
53 *decoded_frame_history_.GetLastDecodedFrameTimestamp())) {
54 + TRACE_EVENT2("webrtc",
55 + "FrameBuffer::InsertFrame Frames dropped (OOO + PicId jump)",
56 + "remote_ssrc", ssrc, "frame_id", frame->Id());
57 RTC_DLOG(LS_WARNING)
58 << "Keyframe " << frame->Id()
59 << " has newer timestamp but older picture id, clearing buffer.";
60 Clear();
61 } else {
62 // Already decoded past this frame.
63 + TRACE_EVENT2("webrtc",
64 + "FrameBuffer::InsertFrame Frame dropped (Out of order)",
65 + "remote_ssrc", ssrc, "frame_id", frame->Id());
66 return false;
70 if (frames_.size() == max_size_) {
71 if (frame->is_keyframe()) {
72 + TRACE_EVENT2("webrtc",
73 + "FrameBuffer::InsertFrame Frames dropped (KF + Full buffer)",
74 + "remote_ssrc", ssrc, "frame_id", frame->Id());
75 RTC_DLOG(LS_WARNING) << "Keyframe " << frame->Id()
76 << " inserted into full buffer, clearing buffer.";
77 Clear();
78 } else {
79 // No space for this frame.
80 + TRACE_EVENT2("webrtc",
81 + "FrameBuffer::InsertFrame Frame dropped (Full buffer)",
82 + "remote_ssrc", ssrc, "frame_id", frame->Id());
83 return false;
86 @@ -149,16 +167,31 @@ void FrameBuffer::DropNextDecodableTemporalUnit() {
88 void FrameBuffer::UpdateDroppedFramesAndDiscardedPackets(FrameIterator begin_it,
89 FrameIterator end_it) {
90 + uint32_t dropped_ssrc = 0;
91 + int64_t dropped_frame_id = 0;
92 unsigned int num_discarded_packets = 0;
93 unsigned int num_dropped_frames =
94 std::count_if(begin_it, end_it, [&](const auto& f) {
95 if (f.second.encoded_frame) {
96 const auto& packetInfos = f.second.encoded_frame->PacketInfos();
97 + dropped_frame_id = f.first;
98 + if (!packetInfos.empty()) {
99 + dropped_ssrc = packetInfos[0].ssrc();
101 num_discarded_packets += packetInfos.size();
103 return f.second.encoded_frame != nullptr;
106 + if (num_dropped_frames > 0) {
107 + TRACE_EVENT2("webrtc", "FrameBuffer Dropping Old Frames", "remote_ssrc",
108 + dropped_ssrc, "frame_id", dropped_frame_id);
110 + if (num_discarded_packets > 0) {
111 + TRACE_EVENT2("webrtc", "FrameBuffer Discarding Old Packets", "remote_ssrc",
112 + dropped_ssrc, "frame_id", dropped_frame_id);
115 num_dropped_frames_ += num_dropped_frames;
116 num_discarded_packets_ += num_discarded_packets;
118 diff --git a/video/receive_statistics_proxy.cc b/video/receive_statistics_proxy.cc
119 index a0f19999d8..1764308c0a 100644
120 --- a/video/receive_statistics_proxy.cc
121 +++ b/video/receive_statistics_proxy.cc
122 @@ -20,6 +20,7 @@
123 #include "rtc_base/strings/string_builder.h"
124 #include "rtc_base/thread.h"
125 #include "rtc_base/time_utils.h"
126 +#include "rtc_base/trace_event.h"
127 #include "system_wrappers/include/clock.h"
128 #include "system_wrappers/include/metrics.h"
129 #include "video/video_receive_stream2.h"
130 @@ -767,6 +768,9 @@ void ReceiveStatisticsProxy::OnCompleteFrame(bool is_keyframe,
131 VideoContentType content_type) {
132 RTC_DCHECK_RUN_ON(&main_thread_);
134 + TRACE_EVENT2("webrtc", "ReceiveStatisticsProxy::OnCompleteFrame",
135 + "remote_ssrc", remote_ssrc_, "is_keyframe", is_keyframe);
137 // Content type extension is set only for keyframes and should be propagated
138 // for all the following delta frames. Here we may receive frames out of order
139 // and miscategorise some delta frames near the layer switch.
140 @@ -792,6 +796,8 @@ void ReceiveStatisticsProxy::OnCompleteFrame(bool is_keyframe,
141 void ReceiveStatisticsProxy::OnDroppedFrames(uint32_t frames_dropped) {
142 // Can be called on either the decode queue or the worker thread
143 // See FrameBuffer2 for more details.
144 + TRACE_EVENT2("webrtc", "ReceiveStatisticsProxy::OnDroppedFrames",
145 + "remote_ssrc", remote_ssrc_, "frames_dropped", frames_dropped);
146 worker_thread_->PostTask(
147 SafeTask(task_safety_.flag(), [frames_dropped, this]() {
148 RTC_DCHECK_RUN_ON(&main_thread_);
149 @@ -802,6 +808,9 @@ void ReceiveStatisticsProxy::OnDroppedFrames(uint32_t frames_dropped) {
150 void ReceiveStatisticsProxy::OnDiscardedPackets(uint32_t packets_discarded) {
151 // Can be called on either the decode queue or the worker thread
152 // See FrameBuffer2 for more details.
153 + TRACE_EVENT2("webrtc", "ReceiveStatisticsProxy::OnDiscardedPackets",
154 + "remote_ssrc", remote_ssrc_, "packets_discarded",
155 + packets_discarded);
156 worker_thread_->PostTask(
157 SafeTask(task_safety_.flag(), [packets_discarded, this]() {
158 RTC_DCHECK_RUN_ON(&main_thread_);
159 @@ -830,6 +839,8 @@ void ReceiveStatisticsProxy::OnStreamInactive() {
161 void ReceiveStatisticsProxy::OnRttUpdate(int64_t avg_rtt_ms) {
162 RTC_DCHECK_RUN_ON(&main_thread_);
163 + TRACE_EVENT2("webrtc", "ReceiveStatisticsProxy::OnRttUpdate",
164 + "remote_ssrc", remote_ssrc_, "avg_rtt_ms", avg_rtt_ms);
165 avg_rtt_ms_ = avg_rtt_ms;
168 diff --git a/video/rtp_video_stream_receiver2.cc b/video/rtp_video_stream_receiver2.cc
169 index 12e777c58f..a07dad5d4b 100644
170 --- a/video/rtp_video_stream_receiver2.cc
171 +++ b/video/rtp_video_stream_receiver2.cc
172 @@ -44,6 +44,7 @@
173 #include "rtc_base/checks.h"
174 #include "rtc_base/logging.h"
175 #include "rtc_base/strings/string_builder.h"
176 +#include "rtc_base/trace_event.h"
177 #include "system_wrappers/include/metrics.h"
178 #include "system_wrappers/include/ntp_time.h"
180 @@ -1223,6 +1224,9 @@ void RtpVideoStreamReceiver2::FrameDecoded(int64_t picture_id) {
181 packet_infos_.upper_bound(unwrapped_rtp_seq_num));
182 uint32_t num_packets_cleared = packet_buffer_.ClearTo(seq_num);
183 if (num_packets_cleared > 0) {
184 + TRACE_EVENT2("webrtc",
185 + "RtpVideoStreamReceiver2::FrameDecoded Cleared Old Packets",
186 + "remote_ssrc", config_.rtp.remote_ssrc, "seq_num", seq_num);
187 vcm_receive_statistics_->OnDiscardedPackets(num_packets_cleared);
189 reference_finder_->ClearTo(seq_num);
190 diff --git a/video/video_stream_buffer_controller.cc b/video/video_stream_buffer_controller.cc
191 index e6e16db752..8d880ca0ee 100644
192 --- a/video/video_stream_buffer_controller.cc
193 +++ b/video/video_stream_buffer_controller.cc
194 @@ -31,6 +31,7 @@
195 #include "rtc_base/checks.h"
196 #include "rtc_base/logging.h"
197 #include "rtc_base/thread_annotations.h"
198 +#include "rtc_base/trace_event.h"
199 #include "video/frame_decode_scheduler.h"
200 #include "video/frame_decode_timing.h"
201 #include "video/task_queue_frame_decode_scheduler.h"
202 @@ -152,6 +153,9 @@ absl::optional<int64_t> VideoStreamBufferController::InsertFrame(
203 std::unique_ptr<EncodedFrame> frame) {
204 RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
205 FrameMetadata metadata(*frame);
206 + const uint32_t ssrc =
207 + frame->PacketInfos().empty() ? 0 : frame->PacketInfos()[0].ssrc();
208 + const int64_t frameId = frame->Id();
209 int complete_units = buffer_->GetTotalNumberOfContinuousTemporalUnits();
210 if (buffer_->InsertFrame(std::move(frame))) {
211 RTC_DCHECK(metadata.receive_time) << "Frame receive time must be set!";
212 @@ -162,6 +166,9 @@ absl::optional<int64_t> VideoStreamBufferController::InsertFrame(
213 *metadata.receive_time);
215 if (complete_units < buffer_->GetTotalNumberOfContinuousTemporalUnits()) {
216 + TRACE_EVENT2("webrtc",
217 + "VideoStreamBufferController::InsertFrame Frame Complete",
218 + "remote_ssrc", ssrc, "frame_id", frameId);
219 stats_proxy_->OnCompleteFrame(metadata.is_keyframe, metadata.size,
220 metadata.contentType);
221 MaybeScheduleFrameForRelease();