tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit cb867d5a618117c7b73716d917e938b36dfc4029
parent 7a84f98d6e88d76945bf88baba69b10089b565f5
Author: Dan Baker <dbaker@mozilla.com>
Date:   Mon, 27 Oct 2025 12:16:48 -0600

Bug 1995393 - Vendor libwebrtc from c530e64f66

Upstream commit: https://webrtc.googlesource.com/src/+/c530e64f660f3a10db47baf576b86031336f639c
    Fix wraparound issue in FrameInstrumentationGenerator.

    This prevents an RTC_CHECK from triggering if the sequence index
    wraparound happens on a delta frame.

    Bug: webrtc:440978611, chromium:440989756
    Change-Id: I4d893687391e87a0d2a8476d0db70153b0e8a768
    Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/406100
    Commit-Queue: Erik Språng <sprang@webrtc.org>
    Reviewed-by: Fanny Linderborg <linderborg@webrtc.org>
    Auto-Submit: Erik Språng <sprang@webrtc.org>
    Cr-Commit-Position: refs/heads/main@{#45426}

Diffstat:
Mthird_party/libwebrtc/README.mozilla.last-vendor | 4++--
Mthird_party/libwebrtc/video/corruption_detection/frame_instrumentation_generator.cc | 20++++++++++----------
Mthird_party/libwebrtc/video/corruption_detection/frame_instrumentation_generator_unittest.cc | 48++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 60 insertions(+), 12 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-10-27T18:14:02.272854+00:00. +libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-10-27T18:16:31.261057+00:00. # base of lastest vendoring -a2dab3cb79 +c530e64f66 diff --git a/third_party/libwebrtc/video/corruption_detection/frame_instrumentation_generator.cc b/third_party/libwebrtc/video/corruption_detection/frame_instrumentation_generator.cc @@ -140,17 +140,17 @@ FrameInstrumentationGenerator::OnEncodedImage( } int sequence_index = contexts_[layer_id].frame_sampler.GetCurrentIndex(); - if (is_key_frame) { + if (is_key_frame && ((sequence_index & 0b0111'1111) != 0)) { // Increase until all the last 7 bits are zeroes. - // If this would overflow to 15 bits, reset to 0. - if (sequence_index > 0b0011'1111'1000'0000) { - sequence_index = 0; - } else if ((sequence_index & 0b0111'1111) != 0) { - // Last 7 bits are not all zeroes. - sequence_index >>= 7; - sequence_index += 1; - sequence_index <<= 7; - } + sequence_index >>= 7; + sequence_index += 1; + sequence_index <<= 7; + contexts_[layer_id].frame_sampler.SetCurrentIndex(sequence_index); + } + + if (sequence_index >= (1 << 14)) { + // Overflow of 14 bit counter, reset to 0. + sequence_index = 0; contexts_[layer_id].frame_sampler.SetCurrentIndex(sequence_index); } diff --git a/third_party/libwebrtc/video/corruption_detection/frame_instrumentation_generator_unittest.cc b/third_party/libwebrtc/video/corruption_detection/frame_instrumentation_generator_unittest.cc @@ -581,6 +581,54 @@ TEST(FrameInstrumentationGeneratorTest, EXPECT_EQ(data1->sequence_index(), 0b0000'1000'0000); EXPECT_EQ(data2->sequence_index(), 0b0001'0000'0000); } +TEST(FrameInstrumentationGeneratorTest, + SequenceIndexThatWouldOverflowTo15BitsIncreasesCorrectlyAtNewDeltaFrame) { + FrameInstrumentationGenerator generator(VideoCodecType::kVideoCodecVP8); + generator.OnCapturedFrame( + VideoFrame::Builder() + .set_video_frame_buffer(MakeI420FrameBufferWithDifferentPixelValues()) + .set_rtp_timestamp(1) + .build()); + EncodedImage encoded_image; + encoded_image.SetRtpTimestamp(1); + encoded_image.SetFrameType(VideoFrameType::kVideoFrameDelta); + encoded_image.qp_ = 10; + encoded_image._encodedWidth = kDefaultScaledWidth; + encoded_image._encodedHeight = kDefaultScaledHeight; + encoded_image.SetSimulcastIndex(0); + + constexpr int kMaxSequenceIndex = 0b11'1111'1111'1111; + + generator.SetHaltonSequenceIndex(kMaxSequenceIndex, + generator.GetLayerId(encoded_image)); + std::optional<FrameInstrumentationData> data = + generator.OnEncodedImage(encoded_image); + + ASSERT_TRUE(data.has_value()); + EXPECT_EQ(data->sequence_index(), kMaxSequenceIndex); + + // Loop until we get a new delta frame. + bool has_found_delta_frame = false; + for (int i = 0; i < 34; ++i) { + generator.OnCapturedFrame( + VideoFrame::Builder() + .set_video_frame_buffer( + MakeI420FrameBufferWithDifferentPixelValues()) + .set_rtp_timestamp(i + 2) + .build()); + + encoded_image.SetRtpTimestamp(i + 2); + + std::optional<FrameInstrumentationData> frame_instrumentation_data = + generator.OnEncodedImage(encoded_image); + if (frame_instrumentation_data.has_value()) { + has_found_delta_frame = true; + EXPECT_EQ(frame_instrumentation_data->sequence_index(), 0); + break; + } + } + EXPECT_TRUE(has_found_delta_frame); +} TEST(FrameInstrumentationGeneratorTest, GetterAndSetterOperatesAsExpected) { FrameInstrumentationGenerator generator(VideoCodecType::kVideoCodecVP8);