commit 88fd2bce08d43b7c91744fc23fe1db33cfa5d30b parent 89525bae9247bcde1591b54b99f73913cd4640ea Author: Michael Froman <mfroman@mozilla.com> Date: Mon, 5 Jan 2026 17:07:47 +0000 Bug 2007457 - Cherry-pick upstream libwebrtc commit e51c178a37 r=bwc Upstream commit: https://webrtc.googlesource.com/src/+/e51c178a37bed3e5ffaf162eee4da7e15161a25f [EncodedTransform] Expose Rid in TransformableVideoFrameInterface This will aid in the implementation of the generateKeyFrame method of EncodedTransform and the rid RTCVideoFrameMetadata field on the Web. Bug: chromium:399327934 Change-Id: I8e5e9ebc3bcf99f4c25fcd7178852f8f5ad9d72b Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/413240 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Guido Urdaneta <guidou@webrtc.org> Cr-Commit-Position: refs/heads/main@{#45802} Differential Revision: https://phabricator.services.mozilla.com/D277390 Diffstat:
10 files changed, 54 insertions(+), 19 deletions(-)
diff --git a/third_party/libwebrtc/api/frame_transformer_interface.h b/third_party/libwebrtc/api/frame_transformer_interface.h @@ -114,9 +114,8 @@ class TransformableVideoFrameInterface : public TransformableFrameInterface { RTC_EXPORT explicit TransformableVideoFrameInterface(Passkey passkey); virtual ~TransformableVideoFrameInterface() = default; virtual bool IsKeyFrame() const = 0; - + virtual std::optional<std::string> Rid() const { return std::nullopt; } virtual VideoFrameMetadata Metadata() const = 0; - virtual void SetMetadata(const VideoFrameMetadata&) = 0; }; diff --git a/third_party/libwebrtc/api/test/mock_transformable_video_frame.h b/third_party/libwebrtc/api/test/mock_transformable_video_frame.h @@ -34,6 +34,7 @@ class MockTransformableVideoFrame : public TransformableVideoFrameInterface { MOCK_METHOD(void, SetRTPTimestamp, (uint32_t), (override)); MOCK_METHOD(uint32_t, GetSsrc, (), (const, override)); MOCK_METHOD(bool, IsKeyFrame, (), (const, override)); + MOCK_METHOD(std::optional<std::string>, Rid, (), (const, override)); MOCK_METHOD(void, SetMetadata, (const VideoFrameMetadata&), (override)); MOCK_METHOD(uint8_t, GetPayloadType, (), (const, override)); MOCK_METHOD(bool, CanSetPayloadType, (), (const, override)); diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.h b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender.h @@ -140,6 +140,8 @@ class RTPSender { uint32_t SSRC() const RTC_LOCKS_EXCLUDED(send_mutex_) { return ssrc_; } + std::string Rid() const RTC_LOCKS_EXCLUDED(send_mutex_) { return rid_; } + std::optional<uint32_t> FlexfecSsrc() const RTC_LOCKS_EXCLUDED(send_mutex_) { return flexfec_ssrc_; } diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video.cc @@ -185,6 +185,7 @@ RTPSenderVideo::RTPSenderVideo(const Config& config) this, config.frame_transformer, rtp_sender_->SSRC(), + rtp_sender_->Rid(), config.task_queue_factory) : nullptr) { if (frame_transformer_delegate_) diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.cc @@ -56,7 +56,8 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { uint32_t rtp_timestamp, TimeDelta expected_retransmission_time, uint32_t ssrc, - std::vector<uint32_t> csrcs) + std::vector<uint32_t> csrcs, + std::string rid) : TransformableVideoFrameInterface(Passkey()), encoded_data_(encoded_image.GetEncodedData()), pre_transform_payload_size_(encoded_image.size()), @@ -69,7 +70,8 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { presentation_timestamp_(encoded_image.PresentationTimestamp()), expected_retransmission_time_(expected_retransmission_time), ssrc_(ssrc), - csrcs_(csrcs) { + csrcs_(std::move(csrcs)), + rid_(std::move(rid)) { RTC_DCHECK_GE(payload_type_, 0); RTC_DCHECK_LE(payload_type_, 127); } @@ -96,6 +98,8 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { return frame_type_ == VideoFrameType::kVideoFrameKey; } + std::optional<std::string> Rid() const override { return rid_; } + VideoFrameMetadata Metadata() const override { VideoFrameMetadata metadata = header_.GetAsMetadata(); metadata.SetSsrc(ssrc_); @@ -156,16 +160,19 @@ class TransformableVideoSenderFrame : public TransformableVideoFrameInterface { uint32_t ssrc_; std::vector<uint32_t> csrcs_; + const std::string rid_; }; RTPSenderVideoFrameTransformerDelegate::RTPSenderVideoFrameTransformerDelegate( RTPVideoFrameSenderInterface* sender, scoped_refptr<FrameTransformerInterface> frame_transformer, uint32_t ssrc, + std::string rid, TaskQueueFactory* task_queue_factory) : sender_(sender), frame_transformer_(std::move(frame_transformer)), ssrc_(ssrc), + rid_(std::move(rid)), transformation_queue_(task_queue_factory->CreateTaskQueue( "video_frame_transformer", TaskQueueFactory::Priority::NORMAL)) {} @@ -195,7 +202,7 @@ bool RTPSenderVideoFrameTransformerDelegate::TransformFrame( } frame_transformer_->Transform(std::make_unique<TransformableVideoSenderFrame>( encoded_image, video_header, payload_type, codec_type, rtp_timestamp, - expected_retransmission_time, ssrc_, csrcs)); + expected_retransmission_time, ssrc_, csrcs, rid_)); return true; } @@ -306,7 +313,8 @@ std::unique_ptr<TransformableVideoFrameInterface> CloneSenderVideoFrame( return std::make_unique<TransformableVideoSenderFrame>( encoded_image, new_header, original->GetPayloadType(), new_header.codec, original->GetTimestamp(), kDefaultRetransmissionsTime, - original->GetSsrc(), metadata.GetCsrcs()); + original->GetSsrc(), metadata.GetCsrcs(), + original->Rid().value_or(std::string())); } } // namespace webrtc diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.h b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate.h @@ -15,6 +15,7 @@ #include <cstdint> #include <memory> #include <optional> +#include <string> #include <vector> #include "api/array_view.h" @@ -67,6 +68,7 @@ class RTPSenderVideoFrameTransformerDelegate : public TransformedFrameCallback { RTPVideoFrameSenderInterface* sender, scoped_refptr<FrameTransformerInterface> frame_transformer, uint32_t ssrc, + std::string rid, TaskQueueFactory* send_transport_queue); void Init(); @@ -116,6 +118,7 @@ class RTPSenderVideoFrameTransformerDelegate : public TransformedFrameCallback { RTPVideoFrameSenderInterface* sender_ RTC_GUARDED_BY(sender_lock_); scoped_refptr<FrameTransformerInterface> frame_transformer_; const uint32_t ssrc_; + const std::string rid_; // Used when the encoded frames arrives without a current task queue. This can // happen if a hardware encoder was used. std::unique_ptr<TaskQueueBase, TaskQueueDeleter> transformation_queue_; diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate_unittest.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video_frame_transformer_delegate_unittest.cc @@ -14,6 +14,7 @@ #include <cstdint> #include <memory> #include <optional> +#include <string> #include <utility> #include <vector> @@ -116,7 +117,8 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, RegisterTransformedFrameCallbackSinkOnInit) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"rid", + time_controller_.CreateTaskQueueFactory().get()); EXPECT_CALL(*frame_transformer_, RegisterTransformedFrameSinkCallback(_, 1111)); delegate->Init(); @@ -126,7 +128,8 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, UnregisterTransformedFrameSinkCallbackOnReset) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"rid", + time_controller_.CreateTaskQueueFactory().get()); EXPECT_CALL(*frame_transformer_, UnregisterTransformedFrameSinkCallback(1111)); delegate->Reset(); @@ -136,12 +139,16 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, TransformFrameCallsTransform) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"myrid", + time_controller_.CreateTaskQueueFactory().get()); VideoFrameMetadata metadata; + std::optional<std::string> rid; EXPECT_CALL(*frame_transformer_, Transform) .WillOnce([&](std::unique_ptr<TransformableFrameInterface> frame) { - metadata = static_cast<TransformableVideoFrameInterface*>(frame.get()) - ->Metadata(); + TransformableVideoFrameInterface* video_frame = + static_cast<TransformableVideoFrameInterface*>(frame.get()); + metadata = video_frame->Metadata(); + rid = video_frame->Rid(); }); std::vector<uint32_t> csrcs = {1, 2, 3}; @@ -153,13 +160,15 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, EXPECT_EQ(metadata.GetSsrc(), 1111U); EXPECT_THAT(metadata.GetCsrcs(), ElementsAreArray(csrcs)); + EXPECT_EQ(rid, "myrid"); } TEST_F(RtpSenderVideoFrameTransformerDelegateTest, OnTransformedFrameCallsSenderSendVideo) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"rid", + time_controller_.CreateTaskQueueFactory().get()); scoped_refptr<TransformedFrameCallback> callback; EXPECT_CALL(*frame_transformer_, RegisterTransformedFrameSinkCallback) @@ -186,7 +195,8 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, TEST_F(RtpSenderVideoFrameTransformerDelegateTest, CloneSenderVideoFrame) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"rid", + time_controller_.CreateTaskQueueFactory().get()); std::unique_ptr<TransformableFrameInterface> frame = GetTransformableFrame(delegate); @@ -202,12 +212,14 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, CloneSenderVideoFrame) { EXPECT_EQ(clone->GetSsrc(), video_frame.GetSsrc()); EXPECT_EQ(clone->GetTimestamp(), video_frame.GetTimestamp()); EXPECT_EQ(clone->Metadata(), video_frame.Metadata()); + EXPECT_EQ(clone->Rid(), video_frame.Rid()); } TEST_F(RtpSenderVideoFrameTransformerDelegateTest, CloneKeyFrame) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"rid", + time_controller_.CreateTaskQueueFactory().get()); std::unique_ptr<TransformableFrameInterface> frame = GetTransformableFrame(delegate, /*key_frame=*/true); @@ -223,12 +235,14 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, CloneKeyFrame) { EXPECT_EQ(clone->GetSsrc(), video_frame.GetSsrc()); EXPECT_EQ(clone->GetTimestamp(), video_frame.GetTimestamp()); EXPECT_EQ(clone->Metadata(), video_frame.Metadata()); + EXPECT_EQ(clone->Rid(), video_frame.Rid()); } TEST_F(RtpSenderVideoFrameTransformerDelegateTest, MetadataAfterSetMetadata) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"rid", + time_controller_.CreateTaskQueueFactory().get()); std::unique_ptr<TransformableFrameInterface> frame = GetTransformableFrame(delegate); @@ -256,7 +270,8 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, ReceiverFrameConvertedToSenderFrame) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"rid", + time_controller_.CreateTaskQueueFactory().get()); const uint8_t payload_type = 1; const uint32_t timestamp = 2; @@ -304,7 +319,8 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, TEST_F(RtpSenderVideoFrameTransformerDelegateTest, SettingRTPTimestamp) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"rid", + time_controller_.CreateTaskQueueFactory().get()); std::unique_ptr<TransformableFrameInterface> frame = GetTransformableFrame(delegate); @@ -322,7 +338,8 @@ TEST_F(RtpSenderVideoFrameTransformerDelegateTest, ShortCircuitingSkipsTransform) { auto delegate = make_ref_counted<RTPSenderVideoFrameTransformerDelegate>( &test_sender_, frame_transformer_, - /*ssrc=*/1111, time_controller_.CreateTaskQueueFactory().get()); + /*ssrc=*/1111, /*rid=*/"rid", + time_controller_.CreateTaskQueueFactory().get()); EXPECT_CALL(*frame_transformer_, RegisterTransformedFrameSinkCallback(_, 1111)); delegate->Init(); diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_sender_video_unittest.cc @@ -1575,7 +1575,8 @@ class RtpSenderVideoWithFrameTransformerTest : public ::testing::Test { env_, {.outgoing_transport = &transport_, .retransmission_rate_limiter = &retransmission_rate_limiter_, - .local_media_ssrc = kSsrc}) { + .local_media_ssrc = kSsrc, + .rid = "myrid"}) { rtp_module_.SetSequenceNumber(kSeqNum); rtp_module_.SetStartTimestamp(0); } @@ -1818,6 +1819,7 @@ TEST_F(RtpSenderVideoWithFrameTransformerTest, transformable_frame.release())); ASSERT_TRUE(frame); auto metadata = frame->Metadata(); + EXPECT_EQ(frame->Rid(), "myrid"); EXPECT_EQ(metadata.GetWidth(), 1280u); EXPECT_EQ(metadata.GetHeight(), 720u); EXPECT_EQ(metadata.GetFrameId(), 10); diff --git a/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_video_stream_receiver_frame_transformer_delegate_unittest.cc b/third_party/libwebrtc/modules/rtp_rtcp/source/rtp_video_stream_receiver_frame_transformer_delegate_unittest.cc @@ -217,6 +217,7 @@ TEST(RtpVideoStreamReceiverFrameTransformerDelegateTest, EXPECT_GE(frame->ReceiveTime()->us(), 0); EXPECT_EQ(frame->CaptureTime(), capture_time); EXPECT_EQ(frame->SenderCaptureTimeOffset(), sender_capture_time_offset); + EXPECT_FALSE(frame->Rid().has_value()); }); // The delegate creates a transformable frame from the RtpFrameObject. delegate->TransformFrame(CreateRtpFrameObject(video_header, csrcs)); diff --git a/third_party/libwebrtc/moz-patch-stack/e51c178a37.no-op-cherry-pick-msg b/third_party/libwebrtc/moz-patch-stack/e51c178a37.no-op-cherry-pick-msg @@ -0,0 +1 @@ +We cherry-picked this in bug 2007457