tor-browser

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

commit 8e6e4b84c679556e3402c412e5a9452ed920db8e
parent 938f781ea7e0adcd72b61f1b5366d9c3241d3294
Author: Dan Baker <dbaker@mozilla.com>
Date:   Mon,  1 Dec 2025 20:39:02 -0700

Bug 2000941 - Vendor libwebrtc from 34e3cb8457

Upstream commit: https://webrtc.googlesource.com/src/+/34e3cb8457d01b225aa885870055b39ae62b20df
    Modify MediaEngine's GetRtpHeaderExtensions() call to use field trials from the caller rather than from the media engine.

    This is required in order to have field trials select different header extensions for different PeerConnections from the same PeerConnectionFactory.

    This will allow us to have immutable field trials, yay!
    see (not yet complete) https://webrtc-review.googlesource.com/c/src/+/409040

    Bug: b/444370738
    Change-Id: I9ddedbeaf7b5d19fddf96d62d73020e4910305f3
    Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/409540
    Reviewed-by: Harald Alvestrand <hta@webrtc.org>
    Commit-Queue: Jonas Oreland <jonaso@webrtc.org>
    Cr-Commit-Position: refs/heads/main@{#45650}

Diffstat:
Mthird_party/libwebrtc/README.mozilla.last-vendor | 4++--
Mthird_party/libwebrtc/media/base/fake_media_engine.cc | 6++++--
Mthird_party/libwebrtc/media/base/fake_media_engine.h | 8++++----
Mthird_party/libwebrtc/media/base/media_engine.cc | 6++++--
Mthird_party/libwebrtc/media/base/media_engine.h | 7++++---
Mthird_party/libwebrtc/media/base/media_engine_unittest.cc | 6+++---
Mthird_party/libwebrtc/media/engine/webrtc_video_engine.cc | 23++++++++++++++---------
Mthird_party/libwebrtc/media/engine/webrtc_video_engine.h | 9++++++---
Mthird_party/libwebrtc/media/engine/webrtc_video_engine_unittest.cc | 3++-
Mthird_party/libwebrtc/media/engine/webrtc_voice_engine.cc | 3++-
Mthird_party/libwebrtc/media/engine/webrtc_voice_engine.h | 4++--
Mthird_party/libwebrtc/media/engine/webrtc_voice_engine_unittest.cc | 6++++--
Mthird_party/libwebrtc/pc/peer_connection_factory.cc | 16++++++++--------
Mthird_party/libwebrtc/pc/peer_connection_integrationtest.cc | 45+++++++++++++++++++++++++++++++++++++++++++++
Mthird_party/libwebrtc/pc/rtp_transceiver_unittest.cc | 3++-
Mthird_party/libwebrtc/pc/rtp_transmission_manager.cc | 6++++--
Mthird_party/libwebrtc/pc/sdp_offer_answer.cc | 12++++++++----
17 files changed, 118 insertions(+), 49 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:36:25.983609+00:00. +libwebrtc updated from /Users/danielbaker/elm/.moz-fast-forward/moz-libwebrtc commit mozpatches on 2025-12-02T03:38:48.183160+00:00. # base of lastest vendoring -e4b65f8ebc +34e3cb8457 diff --git a/third_party/libwebrtc/media/base/fake_media_engine.cc b/third_party/libwebrtc/media/base/fake_media_engine.cc @@ -624,7 +624,8 @@ std::optional<AudioDeviceModule::Stats> FakeVoiceEngine::GetAudioDeviceStats() { void FakeVoiceEngine::StopAecDump() {} std::vector<RtpHeaderExtensionCapability> -FakeVoiceEngine::GetRtpHeaderExtensions() const { +FakeVoiceEngine::GetRtpHeaderExtensions( + const FieldTrialsView* field_trials) const { return header_extensions_; } @@ -699,7 +700,8 @@ bool FakeVideoEngine::SetCapture(bool capture) { return true; } std::vector<RtpHeaderExtensionCapability> -FakeVideoEngine::GetRtpHeaderExtensions() const { +FakeVideoEngine::GetRtpHeaderExtensions( + const FieldTrialsView* field_trials) const { return header_extensions_; } void FakeVideoEngine::SetRtpHeaderExtensions( diff --git a/third_party/libwebrtc/media/base/fake_media_engine.h b/third_party/libwebrtc/media/base/fake_media_engine.h @@ -822,8 +822,8 @@ class FakeVoiceEngine : public VoiceEngineInterface { bool StartAecDump(FileWrapper file, int64_t max_size_bytes) override; void StopAecDump() override; std::optional<AudioDeviceModule::Stats> GetAudioDeviceStats() override; - std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions() - const override; + std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions( + const FieldTrialsView* field_trials) const override; void SetRtpHeaderExtensions( std::vector<RtpHeaderExtensionCapability> header_extensions); @@ -924,8 +924,8 @@ class FakeVideoEngine : public VideoEngineInterface { void SetSendCodecs(const std::vector<Codec>& codecs); void SetRecvCodecs(const std::vector<Codec>& codecs); bool SetCapture(bool capture); - std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions() - const override; + std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions( + const FieldTrialsView* field_trials) const override; void SetRtpHeaderExtensions( std::vector<RtpHeaderExtensionCapability> header_extensions); diff --git a/third_party/libwebrtc/media/base/media_engine.cc b/third_party/libwebrtc/media/base/media_engine.cc @@ -77,9 +77,11 @@ RtpParameters CreateRtpParametersWithEncodings(StreamParams sp) { } std::vector<RtpExtension> GetDefaultEnabledRtpHeaderExtensions( - const RtpHeaderExtensionQueryInterface& query_interface) { + const RtpHeaderExtensionQueryInterface& query_interface, + const webrtc::FieldTrialsView* field_trials) { std::vector<RtpExtension> extensions; - for (const auto& entry : query_interface.GetRtpHeaderExtensions()) { + for (const auto& entry : + query_interface.GetRtpHeaderExtensions(field_trials)) { if (entry.direction != RtpTransceiverDirection::kStopped) extensions.emplace_back(entry.uri, *entry.preferred_id); } diff --git a/third_party/libwebrtc/media/base/media_engine.h b/third_party/libwebrtc/media/base/media_engine.h @@ -77,8 +77,8 @@ class RtpHeaderExtensionQueryInterface { // Returns a vector of RtpHeaderExtensionCapability, whose direction is // kStopped if the extension is stopped (not used) by default. - virtual std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions() - const = 0; + virtual std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions( + const webrtc::FieldTrialsView* field_trials) const = 0; }; class VoiceEngineInterface : public RtpHeaderExtensionQueryInterface { @@ -238,7 +238,8 @@ RtpParameters CreateRtpParametersWithEncodings(StreamParams sp); // offered by default, i.e. the list of extensions returned from // GetRtpHeaderExtensions() that are not kStopped. std::vector<RtpExtension> GetDefaultEnabledRtpHeaderExtensions( - const RtpHeaderExtensionQueryInterface& query_interface); + const RtpHeaderExtensionQueryInterface& query_interface, + const webrtc::FieldTrialsView* field_trials); } // namespace webrtc diff --git a/third_party/libwebrtc/media/base/media_engine_unittest.cc b/third_party/libwebrtc/media/base/media_engine_unittest.cc @@ -40,7 +40,7 @@ class MockRtpHeaderExtensionQueryInterface public: MOCK_METHOD(std::vector<RtpHeaderExtensionCapability>, GetRtpHeaderExtensions, - (), + (const FieldTrialsView*), (const, override)); }; @@ -60,7 +60,7 @@ TEST(MediaEngineTest, ReturnsNotStoppedHeaderExtensions) { RtpHeaderExtensionCapability("uri5", 5, RtpTransceiverDirection::kRecvOnly)}); EXPECT_CALL(mock, GetRtpHeaderExtensions).WillOnce(Return(extensions)); - EXPECT_THAT(GetDefaultEnabledRtpHeaderExtensions(mock), + EXPECT_THAT(GetDefaultEnabledRtpHeaderExtensions(mock, nullptr), ElementsAre(Field(&RtpExtension::uri, StrEq("uri1")), Field(&RtpExtension::uri, StrEq("uri2")), Field(&RtpExtension::uri, StrEq("uri4")), @@ -74,7 +74,7 @@ class MostlyMockVoiceEngineInterface : public VoiceEngineInterface { public: MOCK_METHOD(std::vector<RtpHeaderExtensionCapability>, GetRtpHeaderExtensions, - (), + (const FieldTrialsView*), (const, override)); MOCK_METHOD(void, Init, (), (override)); MOCK_METHOD(scoped_refptr<AudioState>, GetAudioState, (), (const, override)); diff --git a/third_party/libwebrtc/media/engine/webrtc_video_engine.cc b/third_party/libwebrtc/media/engine/webrtc_video_engine.cc @@ -858,7 +858,13 @@ std::vector<Codec> WebRtcVideoEngine::LegacyRecvCodecs(bool include_rtx) const { } std::vector<RtpHeaderExtensionCapability> -WebRtcVideoEngine::GetRtpHeaderExtensions() const { +WebRtcVideoEngine::GetRtpHeaderExtensions( + const webrtc::FieldTrialsView* field_trials) const { + // Use field trials from PeerConnection `field_trials` or from + // PeerConnectionFactory `trials_`. + const webrtc::FieldTrialsView& trials = + (field_trials != nullptr ? *field_trials : trials_); + std::vector<RtpHeaderExtensionCapability> result; // id is *not* incremented for non-default extensions, UsedIds needs to // resolve conflicts. @@ -880,21 +886,20 @@ WebRtcVideoEngine::GetRtpHeaderExtensions() const { result.emplace_back(uri, id, RtpTransceiverDirection::kStopped); } result.emplace_back(RtpExtension::kGenericFrameDescriptorUri00, id, - trials_.IsEnabled("WebRTC-GenericDescriptorAdvertised") + trials.IsEnabled("WebRTC-GenericDescriptorAdvertised") ? RtpTransceiverDirection::kSendRecv : RtpTransceiverDirection::kStopped); result.emplace_back(RtpExtension::kDependencyDescriptorUri, id, - trials_.IsEnabled("WebRTC-DependencyDescriptorAdvertised") + trials.IsEnabled("WebRTC-DependencyDescriptorAdvertised") + ? RtpTransceiverDirection::kSendRecv + : RtpTransceiverDirection::kStopped); + result.emplace_back(RtpExtension::kVideoLayersAllocationUri, id, + trials.IsEnabled("WebRTC-VideoLayersAllocationAdvertised") ? RtpTransceiverDirection::kSendRecv : RtpTransceiverDirection::kStopped); - result.emplace_back( - RtpExtension::kVideoLayersAllocationUri, id, - trials_.IsEnabled("WebRTC-VideoLayersAllocationAdvertised") - ? RtpTransceiverDirection::kSendRecv - : RtpTransceiverDirection::kStopped); // VideoFrameTrackingId is a test-only extension. - if (trials_.IsEnabled("WebRTC-VideoFrameTrackingIdAdvertised")) { + if (trials.IsEnabled("WebRTC-VideoFrameTrackingIdAdvertised")) { result.emplace_back(RtpExtension::kVideoFrameTrackingIdUri, id, RtpTransceiverDirection::kSendRecv); } diff --git a/third_party/libwebrtc/media/engine/webrtc_video_engine.h b/third_party/libwebrtc/media/engine/webrtc_video_engine.h @@ -125,15 +125,18 @@ class WebRtcVideoEngine : public VideoEngineInterface { } std::vector<Codec> LegacySendCodecs(bool include_rtx) const override; std::vector<Codec> LegacyRecvCodecs(bool include_rtx) const override; - std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions() - const override; + + std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions( + /* optional field trials from PeerConnection that override those from + PeerConnectionFactory */ + const webrtc::FieldTrialsView* field_trials) const override; private: const std::unique_ptr<VideoDecoderFactory> decoder_factory_; const std::unique_ptr<VideoEncoderFactory> encoder_factory_; const std::unique_ptr<VideoBitrateAllocatorFactory> bitrate_allocator_factory_; - const FieldTrialsView& trials_; + const FieldTrialsView& trials_; // from PeerConnectionFactory }; struct VideoCodecSettings { diff --git a/third_party/libwebrtc/media/engine/webrtc_video_engine_unittest.cc b/third_party/libwebrtc/media/engine/webrtc_video_engine_unittest.cc @@ -991,7 +991,8 @@ WebRtcVideoEngineTest::SetRecvParamsWithAllSupportedCodecs() { void WebRtcVideoEngineTest::ExpectRtpCapabilitySupport(const char* uri, bool supported) const { const std::vector<RtpExtension> header_extensions = - GetDefaultEnabledRtpHeaderExtensions(engine_); + GetDefaultEnabledRtpHeaderExtensions(engine_, + /* field_trials= */ nullptr); if (supported) { EXPECT_THAT(header_extensions, Contains(Field(&RtpExtension::uri, uri))); } else { diff --git a/third_party/libwebrtc/media/engine/webrtc_voice_engine.cc b/third_party/libwebrtc/media/engine/webrtc_voice_engine.cc @@ -765,7 +765,8 @@ const std::vector<Codec>& WebRtcVoiceEngine::LegacyRecvCodecs() const { } std::vector<RtpHeaderExtensionCapability> -WebRtcVoiceEngine::GetRtpHeaderExtensions() const { +WebRtcVoiceEngine::GetRtpHeaderExtensions( + const webrtc::FieldTrialsView* field_trials) const { RTC_DCHECK(signal_thread_checker_.IsCurrent()); std::vector<RtpHeaderExtensionCapability> result; // id is *not* incremented for non-default extensions, UsedIds needs to diff --git a/third_party/libwebrtc/media/engine/webrtc_voice_engine.h b/third_party/libwebrtc/media/engine/webrtc_voice_engine.h @@ -120,8 +120,8 @@ class WebRtcVoiceEngine final : public VoiceEngineInterface { AudioDecoderFactory* decoder_factory() const override { return decoder_factory_.get(); } - std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions() - const override; + std::vector<RtpHeaderExtensionCapability> GetRtpHeaderExtensions( + const webrtc::FieldTrialsView* field_trials) const override; // Starts AEC dump using an existing file. A maximum file size in bytes can be // specified. When the maximum file size is reached, logging is stopped and diff --git a/third_party/libwebrtc/media/engine/webrtc_voice_engine_unittest.cc b/third_party/libwebrtc/media/engine/webrtc_voice_engine_unittest.cc @@ -2365,7 +2365,8 @@ TEST_P(WebRtcVoiceEngineTestFake, SetSendCodecsCaseInsensitive) { TEST_P(WebRtcVoiceEngineTestFake, SupportsTransportSequenceNumberHeaderExtension) { const std::vector<webrtc::RtpExtension> header_extensions = - webrtc::GetDefaultEnabledRtpHeaderExtensions(*engine_); + webrtc::GetDefaultEnabledRtpHeaderExtensions(*engine_, + /* field_trials= */ nullptr); EXPECT_THAT(header_extensions, Contains(::testing::Field( "uri", &webrtc::RtpExtension::uri, @@ -3603,7 +3604,8 @@ TEST_P(WebRtcVoiceEngineTestFake, ConfiguresAudioReceiveStreamRtpExtensions) { // Set up receive extensions. const std::vector<webrtc::RtpExtension> header_extensions = - webrtc::GetDefaultEnabledRtpHeaderExtensions(*engine_); + webrtc::GetDefaultEnabledRtpHeaderExtensions(*engine_, + /* field_trials= */ nullptr); webrtc::AudioReceiverParameters recv_parameters; recv_parameters.extensions = header_extensions; receive_channel_->SetReceiverParameters(recv_parameters); diff --git a/third_party/libwebrtc/pc/peer_connection_factory.cc b/third_party/libwebrtc/pc/peer_connection_factory.cc @@ -141,15 +141,15 @@ RtpCapabilities PeerConnectionFactory::GetRtpSenderCapabilities( case MediaType::AUDIO: { Codecs cricket_codecs; cricket_codecs = codec_vendor_.audio_send_codecs().codecs(); - auto extensions = - GetDefaultEnabledRtpHeaderExtensions(media_engine()->voice()); + auto extensions = GetDefaultEnabledRtpHeaderExtensions( + media_engine()->voice(), /* field_trials= */ nullptr); return ToRtpCapabilities(cricket_codecs, extensions); } case MediaType::VIDEO: { Codecs cricket_codecs; cricket_codecs = codec_vendor_.video_send_codecs().codecs(); - auto extensions = - GetDefaultEnabledRtpHeaderExtensions(media_engine()->video()); + auto extensions = GetDefaultEnabledRtpHeaderExtensions( + media_engine()->video(), /* field_trials= */ nullptr); return ToRtpCapabilities(cricket_codecs, extensions); } default: @@ -166,14 +166,14 @@ RtpCapabilities PeerConnectionFactory::GetRtpReceiverCapabilities( case MediaType::AUDIO: { Codecs cricket_codecs; cricket_codecs = codec_vendor_.audio_recv_codecs().codecs(); - auto extensions = - GetDefaultEnabledRtpHeaderExtensions(media_engine()->voice()); + auto extensions = GetDefaultEnabledRtpHeaderExtensions( + media_engine()->voice(), /* field_trials= */ nullptr); return ToRtpCapabilities(cricket_codecs, extensions); } case MediaType::VIDEO: { Codecs cricket_codecs = codec_vendor_.video_recv_codecs().codecs(); - auto extensions = - GetDefaultEnabledRtpHeaderExtensions(media_engine()->video()); + auto extensions = GetDefaultEnabledRtpHeaderExtensions( + media_engine()->video(), /* field_trials= */ nullptr); return ToRtpCapabilities(cricket_codecs, extensions); } default: diff --git a/third_party/libwebrtc/pc/peer_connection_integrationtest.cc b/third_party/libwebrtc/pc/peer_connection_integrationtest.cc @@ -100,6 +100,7 @@ namespace webrtc { namespace { using ::testing::AtLeast; +using ::testing::Contains; using ::testing::Eq; using ::testing::Field; using ::testing::Gt; @@ -108,6 +109,7 @@ using ::testing::Invoke; using ::testing::IsTrue; using ::testing::MockFunction; using ::testing::NiceMock; +using ::testing::Not; using ::testing::NotNull; using ::testing::Return; using ::testing::WithParamInterface; @@ -5027,6 +5029,49 @@ TEST_P(PeerConnectionIntegrationTest, DtlsPqcFieldTrial) { #endif // WEBRTC_HAVE_SCTP +TEST_F(PeerConnectionIntegrationTestUnifiedPlan, + PerPeerConnectionHeaderExtensions) { + SetFieldTrials("caller", "WebRTC-VideoFrameTrackingIdAdvertised/Enabled/"); + SetFieldTrials("callee", "WebRTC-VideoFrameTrackingIdAdvertised/Disabled/"); + PeerConnectionInterface::RTCConfiguration config; + PeerConnectionFactoryInterface::Options options; + options.ssl_max_version = SSL_PROTOCOL_DTLS_13; + + const bool create_media_engine = true; + SetCallerPcWrapperAndReturnCurrent(CreatePeerConnectionWrapper( + "caller", &options, &config, PeerConnectionDependencies(nullptr), + /* event_log_factory= */ nullptr, + /* reset_encoder_factory= */ false, + /* reset_decoder_factory= */ false, create_media_engine)); + SetCalleePcWrapperAndReturnCurrent(CreatePeerConnectionWrapper( + "callee", &options, &config, PeerConnectionDependencies(nullptr), + /* event_log_factory= */ nullptr, + /* reset_encoder_factory= */ false, + /* reset_decoder_factory= */ false, create_media_engine)); + + const std::string uri = + "http://www.webrtc.org/experiments/rtp-hdrext/video-frame-tracking-id"; + { + caller()->pc()->AddTransceiver(MediaType::VIDEO); + auto session_description = caller()->CreateOfferAndWait(); + EXPECT_THAT(session_description->description() + ->contents()[0] + .media_description() + ->rtp_header_extensions(), + Contains(Field(&RtpExtension::uri, uri))); + } + + { + callee()->pc()->AddTransceiver(MediaType::VIDEO); + auto session_description = callee()->CreateOfferAndWait(); + EXPECT_THAT(session_description->description() + ->contents()[0] + .media_description() + ->rtp_header_extensions(), + Not(Contains(Field(&RtpExtension::uri, uri)))); + } +} + } // namespace } // namespace webrtc diff --git a/third_party/libwebrtc/pc/rtp_transceiver_unittest.cc b/third_party/libwebrtc/pc/rtp_transceiver_unittest.cc @@ -195,7 +195,8 @@ class RtpTransceiverUnifiedPlanTest : public RtpTransceiverTest { RtpReceiverProxyWithInternal<RtpReceiverInternal>::Create( Thread::Current(), Thread::Current(), std::move(receiver)), context(), codec_lookup_helper(), - media_engine()->voice().GetRtpHeaderExtensions(), + media_engine()->voice().GetRtpHeaderExtensions( + &context()->env().field_trials()), /* on_negotiation_needed= */ [] {}); } diff --git a/third_party/libwebrtc/pc/rtp_transmission_manager.cc b/third_party/libwebrtc/pc/rtp_transmission_manager.cc @@ -335,9 +335,11 @@ RtpTransmissionManager::CreateAndAddTransceiver( } if (header_extensions.empty()) { if (sender->media_type() == MediaType::AUDIO) { - header_extensions = media_engine()->voice().GetRtpHeaderExtensions(); + header_extensions = + media_engine()->voice().GetRtpHeaderExtensions(&env_.field_trials()); } else { - header_extensions = media_engine()->video().GetRtpHeaderExtensions(); + header_extensions = + media_engine()->video().GetRtpHeaderExtensions(&env_.field_trials()); } } diff --git a/third_party/libwebrtc/pc/sdp_offer_answer.cc b/third_party/libwebrtc/pc/sdp_offer_answer.cc @@ -4400,7 +4400,8 @@ void SdpOfferAnswerHandler::GetOptionsForPlanBOffer( MediaType::AUDIO, GetDefaultMidForPlanB(MediaType::AUDIO), RtpTransceiverDirectionFromSendRecv(send_audio, recv_audio), false); options.header_extensions = - media_engine()->voice().GetRtpHeaderExtensions(); + media_engine()->voice().GetRtpHeaderExtensions( + &context_->env().field_trials()); session_options->media_description_options.push_back(options); audio_index = session_options->media_description_options.size() - 1; } @@ -4409,7 +4410,8 @@ void SdpOfferAnswerHandler::GetOptionsForPlanBOffer( MediaType::VIDEO, GetDefaultMidForPlanB(MediaType::VIDEO), RtpTransceiverDirectionFromSendRecv(send_video, recv_video), false); options.header_extensions = - media_engine()->video().GetRtpHeaderExtensions(); + media_engine()->video().GetRtpHeaderExtensions( + &context_->env().field_trials()); session_options->media_description_options.push_back(options); video_index = session_options->media_description_options.size() - 1; } @@ -5543,7 +5545,8 @@ void SdpOfferAnswerHandler::GenerateMediaDescriptionOptions( *audio_index = session_options->media_description_options.size() - 1; } session_options->media_description_options.back().header_extensions = - media_engine()->voice().GetRtpHeaderExtensions(); + media_engine()->voice().GetRtpHeaderExtensions( + &context_->env().field_trials()); } else if (IsVideoContent(&content)) { // If we already have an video m= section, reject this extra one. if (*video_index) { @@ -5559,7 +5562,8 @@ void SdpOfferAnswerHandler::GenerateMediaDescriptionOptions( *video_index = session_options->media_description_options.size() - 1; } session_options->media_description_options.back().header_extensions = - media_engine()->video().GetRtpHeaderExtensions(); + media_engine()->video().GetRtpHeaderExtensions( + &context_->env().field_trials()); } else if (IsUnsupportedContent(&content)) { session_options->media_description_options.push_back( MediaDescriptionOptions(MediaType::UNSUPPORTED, content.mid(),