commit dcb134fd84592acb4b6e49c2ed940a010727b5b2
parent f67ab3649110c6b3b4a6d7b6fe358060c21545f2
Author: Dan Baker <dbaker@mozilla.com>
Date: Mon, 1 Dec 2025 23:52:00 -0700
Bug 2000941 - Vendor libwebrtc from b72ef3160d
Upstream commit: https://webrtc.googlesource.com/src/+/b72ef3160dc34ed925250653159c9bc5699e6065
Clear steady-state refresh flag for key frames
Ensures that a key frame is never flagged as a steady-state
refresh, even if the source metadata suggests it.
This fixes a bug where the QualityConvergenceMonitor would fail to
exit its converged state when a key frame was requested on a static
scene.
Fixed: webrtc:446925524
Change-Id: Idd6a4a9b14ddf95aa3730e493519707363c77ce9
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/411742
Reviewed-by: Sergey Silkin <ssilkin@webrtc.org>
Commit-Queue: Johannes Kron <kron@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#45721}
Diffstat:
3 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/third_party/libwebrtc/README.mozilla.last-vendor b/third_party/libwebrtc/README.mozilla.last-vendor
@@ -1,4 +1,4 @@
# ./mach python dom/media/webrtc/third_party_build/vendor-libwebrtc.py --from-local /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc --commit mozpatches libwebrtc
-libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-12-02T06:49:10.035274+00:00.
+libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-12-02T06:51:47.056078+00:00.
# base of lastest vendoring
-fa7d10eb73
+b72ef3160d
diff --git a/third_party/libwebrtc/video/frame_encode_metadata_writer.cc b/third_party/libwebrtc/video/frame_encode_metadata_writer.cc
@@ -264,8 +264,10 @@ FrameEncodeMetadataWriter::ExtractEncodeStartTimeAndFillMetadata(
encoded_image->ntp_time_ms_ = metadata_list->front().ntp_time_ms;
encoded_image->rotation_ = metadata_list->front().rotation;
encoded_image->SetColorSpace(metadata_list->front().color_space);
+ // Key frames should never be considered as steady state refresh frames.
encoded_image->SetIsSteadyStateRefreshFrame(
- metadata_list->front().is_steady_state_refresh_frame);
+ metadata_list->front().is_steady_state_refresh_frame &&
+ encoded_image->FrameType() != VideoFrameType::kVideoFrameKey);
encoded_image->SetPacketInfos(metadata_list->front().packet_infos);
metadata_list->pop_front();
} else {
diff --git a/third_party/libwebrtc/video/frame_encode_metadata_writer_unittest.cc b/third_party/libwebrtc/video/frame_encode_metadata_writer_unittest.cc
@@ -26,6 +26,7 @@
#include "api/video/video_frame_type.h"
#include "api/video/video_rotation.h"
#include "api/video/video_timing.h"
+#include "api/video_codecs/scalability_mode.h"
#include "api/video_codecs/video_codec.h"
#include "api/video_codecs/video_encoder.h"
#include "common_video/h264/h264_common.h"
@@ -437,6 +438,34 @@ TEST(FrameEncodeMetadataWriterTest, SetsIsSteadyStateRefreshFrame) {
EXPECT_TRUE(image.IsSteadyStateRefreshFrame());
}
+TEST(FrameEncodeMetadataWriterTest, KeyFramesAreNotMarkedAsSteadyStateRefresh) {
+ EncodedImage image;
+ const int64_t kTimestampMs = 123456;
+ FakeEncodedImageCallback sink;
+
+ FrameEncodeMetadataWriter encode_timer(CreateTestEnvironment(), &sink);
+ encode_timer.OnEncoderInit(VideoCodec());
+ // Any non-zero bitrate needed to be set before the first frame.
+ VideoBitrateAllocation bitrate_allocation;
+ bitrate_allocation.SetBitrate(0, 0, 500000);
+ encode_timer.OnSetRates(bitrate_allocation, 30);
+
+ image.SetRtpTimestamp(static_cast<uint32_t>(kTimestampMs * 90));
+
+ VideoFrame::UpdateRect empty_update_rect;
+ empty_update_rect.MakeEmptyUpdate();
+ VideoFrame refresh_frame = VideoFrame::Builder()
+ .set_timestamp_ms(kTimestampMs)
+ .set_rtp_timestamp(kTimestampMs * 90)
+ .set_update_rect(empty_update_rect)
+ .set_video_frame_buffer(kFrameBuffer)
+ .build();
+ encode_timer.OnEncodeStarted(refresh_frame);
+ image.SetFrameType(VideoFrameType::kVideoFrameKey);
+ encode_timer.FillMetadataAndTimingInfo(0, &image);
+ EXPECT_FALSE(image.IsSteadyStateRefreshFrame());
+}
+
TEST(FrameEncodeMetadataWriterTest, CopiesPacketInfos) {
EncodedImage image;
const int64_t kTimestampMs = 123456;