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:
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 {