tor-browser

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

commit 2e313c63b065a60c7bd397564f905b9175e011eb
parent a9c8e9f4fcf0831c1fac9e2d25035fd69e84cff7
Author: Dan Baker <dbaker@mozilla.com>
Date:   Mon,  1 Dec 2025 20:48:11 -0700

Bug 2000941 - Vendor libwebrtc from 0fb14198f9

Upstream commit: https://webrtc.googlesource.com/src/+/0fb14198f97873409f3aee5c9875def7a576f529
    Fix AV1 simulcast timing info loss by preserving spatial layers

    Update FrameEncodeMetadataWriter to be able to handle both simulcast and SVC for AV1. This makes the AV1 logic in OnEncoderInit consistent with the existing VP9 logic.

    Bug: webrtc:442248341
    Change-Id: Ic5375c146e8eae1fc628f7505a46e645072249ec
    Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/407565
    Reviewed-by: Henrik Boström <hbos@webrtc.org>
    Commit-Queue: Erik Språng <sprang@webrtc.org>
    Reviewed-by: Erik Språng <sprang@webrtc.org>
    Cr-Commit-Position: refs/heads/main@{#45654}

Diffstat:
Mthird_party/libwebrtc/README.mozilla.last-vendor | 4++--
Mthird_party/libwebrtc/video/frame_encode_metadata_writer.cc | 4+++-
Mthird_party/libwebrtc/video/frame_encode_metadata_writer_unittest.cc | 70++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 75 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-02T03:45:38.220781+00:00. +libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-12-02T03:47:56.929530+00:00. # base of lastest vendoring -99c1d2dae8 +0fb14198f9 diff --git a/third_party/libwebrtc/video/frame_encode_metadata_writer.cc b/third_party/libwebrtc/video/frame_encode_metadata_writer.cc @@ -77,7 +77,9 @@ void FrameEncodeMetadataWriter::OnEncoderInit(const VideoCodec& codec) { std::unique_ptr<ScalableVideoController> structure = CreateScalabilityStructure(*codec_settings_.GetScalabilityMode()); if (structure) { - num_spatial_layers = structure->StreamConfig().num_spatial_layers; + // Take maximum of simulcast streams and SVC layers + size_t svc_spatial_layers = structure->StreamConfig().num_spatial_layers; + num_spatial_layers = std::max(num_spatial_layers, svc_spatial_layers); } else { // |structure| maybe nullptr if the scalability mode is invalid. RTC_LOG(LS_WARNING) << "Cannot create ScalabilityStructure, since the " diff --git a/third_party/libwebrtc/video/frame_encode_metadata_writer_unittest.cc b/third_party/libwebrtc/video/frame_encode_metadata_writer_unittest.cc @@ -518,5 +518,75 @@ TEST(FrameEncodeMetadataWriterTest, RewritesH264BitstreamWithNonOptimalSps) { testing::ElementsAreArray(kRewrittenSps)); } +TEST(FrameEncodeMetadataWriterTest, Av1SvcSpatialLayersCalculation) { + FakeEncodedImageCallback sink; + FrameEncodeMetadataWriter encode_timer(CreateTestEnvironment(), &sink); + + VideoCodec codec_settings; + codec_settings.codecType = kVideoCodecAV1; + codec_settings.numberOfSimulcastStreams = 1; + codec_settings.SetScalabilityMode(ScalabilityMode::kL2T2); + encode_timer.OnEncoderInit(codec_settings); + + VideoBitrateAllocation bitrate_allocation; + bitrate_allocation.SetBitrate(0, 0, 100000); + bitrate_allocation.SetBitrate(1, 0, 200000); + encode_timer.OnSetRates(bitrate_allocation, 30); + + const int64_t kTimestampMs = 1000; + VideoFrame frame = VideoFrame::Builder() + .set_timestamp_ms(kTimestampMs) + .set_rtp_timestamp(kTimestampMs * 90) + .set_video_frame_buffer(kFrameBuffer) + .build(); + encode_timer.OnEncodeStarted(frame); + + for (int i = 0; i < 2; ++i) { + EncodedImage image; + image.SetEncodedData(EncodedImageBuffer::Create(1000)); + image.capture_time_ms_ = kTimestampMs; + image.SetRtpTimestamp(static_cast<uint32_t>(kTimestampMs * 90)); + image.SetSpatialIndex(i); + encode_timer.FillMetadataAndTimingInfo(i, &image); + EXPECT_EQ(kTimestampMs, image.capture_time_ms_); + EXPECT_TRUE(IsTimingFrame(image)); + } +} + +TEST(FrameEncodeMetadataWriterTest, Av1SimulcastSpatialLayersCalculation) { + FakeEncodedImageCallback sink; + FrameEncodeMetadataWriter encode_timer(CreateTestEnvironment(), &sink); + + VideoCodec codec_settings; + codec_settings.codecType = kVideoCodecAV1; + codec_settings.numberOfSimulcastStreams = 2; + codec_settings.SetScalabilityMode(ScalabilityMode::kL1T1); + encode_timer.OnEncoderInit(codec_settings); + + VideoBitrateAllocation bitrate_allocation; + bitrate_allocation.SetBitrate(0, 0, 100000); + bitrate_allocation.SetBitrate(1, 0, 200000); + encode_timer.OnSetRates(bitrate_allocation, 30); + + const int64_t kTimestampMs = 1000; + VideoFrame frame = VideoFrame::Builder() + .set_timestamp_ms(kTimestampMs) + .set_rtp_timestamp(kTimestampMs * 90) + .set_video_frame_buffer(kFrameBuffer) + .build(); + encode_timer.OnEncodeStarted(frame); + + for (int i = 0; i < 2; ++i) { + EncodedImage image; + image.SetEncodedData(EncodedImageBuffer::Create(1000)); + image.capture_time_ms_ = kTimestampMs; + image.SetRtpTimestamp(static_cast<uint32_t>(kTimestampMs * 90)); + image.SetSimulcastIndex(i); + encode_timer.FillMetadataAndTimingInfo(i, &image); + EXPECT_EQ(kTimestampMs, image.capture_time_ms_); + EXPECT_TRUE(IsTimingFrame(image)); + } +} + } // namespace test } // namespace webrtc