tor-browser

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

commit bb1d99b2c9e2cb624064dfcaff73d42e2f754022
parent 57cb207db55a9625adbe937b2f43ca55cb95929d
Author: Chris Peterson <cpeterson@mozilla.com>
Date:   Wed, 22 Oct 2025 02:56:27 +0000

Bug 1995473 - Add RTCEncodedFrameState constructor for C++20. r=webrtc-reviewers,pehrsons

In C++20, RTCEncodedFrameState is no longer an aggregate because it has a user-declared destructor, so {{...}} no longer performs aggregate initialization. Add a RTCEncodedFrameState constructor and adapt {{...}} callers to use the constructor.

In C++17, the RTCEncodedFrameState struct was an aggregate type because:

* It had no user-declared constructors.
* It only had public data members.
* Having a destructor did not disqualify it from being an aggregate.

Differential Revision: https://phabricator.services.mozilla.com/D269335

Diffstat:
Mdom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp | 10++++++----
Mdom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp | 5+++++
Mdom/media/webrtc/jsapi/RTCEncodedFrameBase.h | 4++++
Mdom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp | 24++++++++++++------------
4 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp b/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp @@ -56,7 +56,8 @@ RTCEncodedAudioFrame::RTCEncodedAudioFrame( nsIGlobalObject* aGlobal, std::unique_ptr<webrtc::TransformableFrameInterface> aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner) - : RTCEncodedAudioFrameData{{std::move(aFrame), aCounter, /*timestamp*/ 0}}, + : RTCEncodedAudioFrameData{RTCEncodedFrameState{std::move(aFrame), aCounter, + /*timestamp*/ 0}}, RTCEncodedFrameBase(aGlobal, static_cast<RTCEncodedFrameState&>(*this)), mOwner(aOwner) { mMetadata.mSynchronizationSource.Construct(mFrame->GetSsrc()); @@ -78,8 +79,9 @@ RTCEncodedAudioFrame::RTCEncodedAudioFrame( RTCEncodedAudioFrame::RTCEncodedAudioFrame(nsIGlobalObject* aGlobal, RTCEncodedAudioFrameData&& aData) - : RTCEncodedAudioFrameData{{std::move(aData.mFrame), aData.mCounter, - aData.mTimestamp}, + : RTCEncodedAudioFrameData{RTCEncodedFrameState{std::move(aData.mFrame), + aData.mCounter, + aData.mTimestamp}, std::move(aData.mMetadata)}, RTCEncodedFrameBase(aGlobal, static_cast<RTCEncodedFrameState&>(*this)), mOwner(nullptr) { @@ -131,7 +133,7 @@ already_AddRefed<RTCEncodedAudioFrame> RTCEncodedAudioFrame::Constructor( RTCEncodedAudioFrameData RTCEncodedAudioFrameData::Clone() const { return RTCEncodedAudioFrameData{ - {webrtc::CloneAudioFrame( + RTCEncodedFrameState{webrtc::CloneAudioFrame( static_cast<webrtc::TransformableAudioFrameInterface*>( mFrame.get()))}, RTCEncodedAudioFrameMetadata(mMetadata)}; diff --git a/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp b/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp @@ -37,6 +37,11 @@ RTCEncodedFrameBase::RTCEncodedFrameBase(nsIGlobalObject* aGlobal, (void*)(mState.mFrame->GetData().data())); } +RTCEncodedFrameState::RTCEncodedFrameState( + std::unique_ptr<webrtc::TransformableFrameInterface> aFrame, + uint64_t aCounter, unsigned long aTimestamp) + : mFrame(std::move(aFrame)), mCounter(aCounter), mTimestamp(aTimestamp) {} + RTCEncodedFrameBase::~RTCEncodedFrameBase() = default; unsigned long RTCEncodedFrameBase::Timestamp() const { diff --git a/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h b/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h @@ -26,6 +26,10 @@ struct RTCEncodedFrameState { uint64_t mCounter = 0; unsigned long mTimestamp = 0; + explicit RTCEncodedFrameState( + std::unique_ptr<webrtc::TransformableFrameInterface> aFrame, + uint64_t aCounter = 0, unsigned long aTimestamp = 0); + // work around only having forward-declared TransformableFrameInterface ~RTCEncodedFrameState(); diff --git a/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp b/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp @@ -55,7 +55,8 @@ RTCEncodedVideoFrame::RTCEncodedVideoFrame( nsIGlobalObject* aGlobal, std::unique_ptr<webrtc::TransformableFrameInterface> aFrame, uint64_t aCounter, RTCRtpScriptTransformer* aOwner) - : RTCEncodedVideoFrameData{{std::move(aFrame), aCounter, /*timestamp*/ 0}}, + : RTCEncodedVideoFrameData{RTCEncodedFrameState{std::move(aFrame), aCounter, + /*timestamp*/ 0}}, RTCEncodedFrameBase(aGlobal, static_cast<RTCEncodedFrameState&>(*this)), mOwner(aOwner) { InitMetadata(); @@ -66,10 +67,10 @@ RTCEncodedVideoFrame::RTCEncodedVideoFrame( RTCEncodedVideoFrame::RTCEncodedVideoFrame(nsIGlobalObject* aGlobal, RTCEncodedVideoFrameData&& aData) - : RTCEncodedVideoFrameData{{std::move(aData.mFrame), aData.mCounter, - aData.mTimestamp}, - aData.mType, - std::move(aData.mMetadata), + : RTCEncodedVideoFrameData{RTCEncodedFrameState{std::move(aData.mFrame), + aData.mCounter, + aData.mTimestamp}, + aData.mType, std::move(aData.mMetadata), aData.mRid}, RTCEncodedFrameBase(aGlobal, static_cast<RTCEncodedFrameState&>(*this)), mOwner(nullptr) { @@ -164,13 +165,12 @@ already_AddRefed<RTCEncodedVideoFrame> RTCEncodedVideoFrame::Constructor( RTCEncodedVideoFrameData RTCEncodedVideoFrameData::Clone() const { return RTCEncodedVideoFrameData{ - {webrtc::CloneVideoFrame( - static_cast<webrtc::TransformableVideoFrameInterface*>( - mFrame.get())), - mCounter, mTimestamp}, - mType, - RTCEncodedVideoFrameMetadata(mMetadata), - mRid}; + RTCEncodedFrameState{ + webrtc::CloneVideoFrame( + static_cast<webrtc::TransformableVideoFrameInterface*>( + mFrame.get())), + mCounter, mTimestamp}, + mType, RTCEncodedVideoFrameMetadata(mMetadata), mRid}; } nsIGlobalObject* RTCEncodedVideoFrame::GetParentObject() const {