Diff
Modified: trunk/LayoutTests/ChangeLog (275818 => 275819)
--- trunk/LayoutTests/ChangeLog 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/LayoutTests/ChangeLog 2021-04-12 13:15:52 UTC (rev 275819)
@@ -1,3 +1,17 @@
+2021-04-12 Youenn Fablet <[email protected]>
+
+ Make sure all frames get transformed when overriding a transform with another one
+ https://bugs.webkit.org/show_bug.cgi?id=224367
+
+ Reviewed by Eric Carlson.
+
+ * http/wpt/webrtc/change-encoded-transform-expected.txt: Added.
+ * http/wpt/webrtc/change-encoded-transform.html: Added.
+ * http/wpt/webrtc/change-encoded-transform.js: Added.
+ (appendToBuffer):
+ (onrtctransform.process):
+ (onrtctransform):
+
2021-04-12 Frederic Wang <[email protected]>
Out of memory crash with find('a'.repeat(2**30))
Added: trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform-expected.txt (0 => 275819)
--- trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform-expected.txt (rev 0)
+++ trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform-expected.txt 2021-04-12 13:15:52 UTC (rev 275819)
@@ -0,0 +1,4 @@
+
+
+PASS change sender transform
+
Added: trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.html (0 => 275819)
--- trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.html (rev 0)
+++ trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.html 2021-04-12 13:15:52 UTC (rev 275819)
@@ -0,0 +1,57 @@
+<!doctype html>
+<html>
+ <head>
+ <meta charset="utf-8">
+ <script src=""
+ <script src=""
+ </head>
+ <body>
+ <video id="video1" autoplay controls playsinline></video>
+ <script src =""
+ <script>
+async function waitForMessage(worker, data)
+{
+ while (true) {
+ const received = await new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+ if (data ="" received)
+ return;
+ }
+}
+
+promise_test(async (test) => {
+ worker = new Worker('change-encoded-transform.js');
+ const data = "" new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+ assert_equals(data, "registered");
+
+ const localStream = await navigator.mediaDevices.getUserMedia({video: true});
+
+ let sender, receiver;
+ const senderTransform1 = new RTCRtpScriptTransform(worker, {name:'sender1'});
+ const senderTransform2 = new RTCRtpScriptTransform(worker, {name:'sender2'});
+ const receiverTransform = new RTCRtpScriptTransform(worker, {name:'receiver'});
+
+ const stream = await new Promise((resolve, reject) => {
+ createConnections((firstConnection) => {
+ sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream);
+ firstConnection.getTransceivers()[0].setCodecPreferences([{mimeType: "video/VP8", clockRate: 90000}]);
+ sender.transform = senderTransform1;
+ }, (secondConnection) => {
+ secondConnection._ontrack_ = (trackEvent) => {
+ receiver = trackEvent.receiver;
+ receiver.transform = receiverTransform;
+ resolve(trackEvent.streams[0]);
+ };
+ });
+ setTimeout(() => reject("Test timed out"), 5000);
+ });
+
+ video1.srcObject = stream;
+ await video1.play();
+
+ const updatePromise = new Promise(resolve => worker._onmessage_ = (event) => resolve(event.data));
+ sender.transform = senderTransform2;
+ assert_equals(await updatePromise, "got value 2");
+}, "change sender transform");
+ </script>
+ </body>
+</html>
Added: trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.js (0 => 275819)
--- trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.js (rev 0)
+++ trunk/LayoutTests/http/wpt/webrtc/change-encoded-transform.js 2021-04-12 13:15:52 UTC (rev 275819)
@@ -0,0 +1,39 @@
+function appendToBuffer(buffer, value) {
+ const result = new ArrayBuffer(buffer.byteLength + 1);
+ const byteResult = new Uint8Array(result);
+ byteResult.set(new Uint8Array(buffer), 0);
+ byteResult[buffer.byteLength] = value;
+ return result;
+}
+
+_onrtctransform_ = (event) => {
+ const transformer = event.transformer;
+
+ transformer.reader = transformer.readable.getReader();
+ transformer.writer = transformer.writable.getWriter();
+
+ function process(transformer)
+ {
+ transformer.reader.read().then(chunk => {
+ if (chunk.done)
+ return;
+ if (transformer.options.name === 'sender1')
+ chunk.value.data = "" 1);
+ else if (transformer.options.name === 'sender2')
+ chunk.value.data = "" 2);
+ else {
+ const value = new Uint8Array(chunk.value.data)[chunk.value.data.byteLength - 1];
+ if (value !== 1 && value !== 2)
+ self.postMessage("unexpected value: " + value);
+ else if (value === 2)
+ self.postMessage("got value 2");
+ chunk.value.data = "" chunk.value.data.byteLength - 1);
+ }
+ transformer.writer.write(chunk.value);
+ process(transformer);
+ });
+ }
+
+ process(transformer);
+};
+self.postMessage("registered");
Modified: trunk/Source/WebCore/ChangeLog (275818 => 275819)
--- trunk/Source/WebCore/ChangeLog 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/ChangeLog 2021-04-12 13:15:52 UTC (rev 275819)
@@ -1,3 +1,48 @@
+2021-04-12 Youenn Fablet <[email protected]>
+
+ Make sure all frames get transformed when overriding a transform with another one
+ https://bugs.webkit.org/show_bug.cgi?id=224367
+
+ Reviewed by Eric Carlson.
+
+ We were previously removing the old transform, then attaching the new transforn.
+ There was a time where no transform was attached and a few samples could get missed.
+ To prevent this, we add a new code path where we transfer a backend from one transform to another.
+ In that case, we synchronoulsy change the input callback from the old one to the new one instead of setting it to null in between.
+
+ Test: http/wpt/webrtc/change-encoded-transform.html
+
+ * Modules/mediastream/RTCRtpReceiver.cpp:
+ (WebCore::RTCRtpReceiver::setTransform):
+ * Modules/mediastream/RTCRtpReceiver.h:
+ * Modules/mediastream/RTCRtpReceiverBackend.h:
+ * Modules/mediastream/RTCRtpScriptTransform.cpp:
+ (WebCore::RTCRtpScriptTransform::~RTCRtpScriptTransform):
+ (WebCore::RTCRtpScriptTransform::willClearBackend):
+ (WebCore::RTCRtpScriptTransform::clear):
+ * Modules/mediastream/RTCRtpScriptTransform.h:
+ * Modules/mediastream/RTCRtpScriptTransformer.cpp:
+ (WebCore::RTCRtpScriptTransformer::clear):
+ * Modules/mediastream/RTCRtpScriptTransformer.h:
+ * Modules/mediastream/RTCRtpSender.cpp:
+ (WebCore::RTCRtpSender::setTransform):
+ * Modules/mediastream/RTCRtpSender.h:
+ * Modules/mediastream/RTCRtpSenderBackend.h:
+ * Modules/mediastream/RTCRtpTransform.cpp:
+ (WebCore::RTCRtpTransform::from):
+ (WebCore::RTCRtpTransform::attachToReceiver):
+ (WebCore::RTCRtpTransform::attachToSender):
+ (WebCore::RTCRtpTransform::backendTransferedToNewTransform):
+ * Modules/mediastream/RTCRtpTransform.h:
+ (WebCore::RTCRtpTransform::takeBackend):
+ * Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp:
+ (WebCore::LibWebRTCRtpReceiverBackend::rtcRtpTransformBackend):
+ * Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h:
+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp:
+ (WebCore::LibWebRTCRtpSenderBackend::LibWebRTCRtpSenderBackend):
+ (WebCore::LibWebRTCRtpSenderBackend::rtcRtpTransformBackend):
+ * Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h:
+
2021-04-12 Frédéric Wang <[email protected]>
Out of memory crash with find('a'.repeat(2**30))
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.cpp 2021-04-12 13:15:52 UTC (rev 275819)
@@ -92,20 +92,25 @@
return PeerConnectionBackend::receiverCapabilities(context, kind);
}
-ExceptionOr<void> RTCRtpReceiver::setTransform(Optional<RTCRtpTransform>&& transform)
+ExceptionOr<void> RTCRtpReceiver::setTransform(std::unique_ptr<RTCRtpTransform>&& transform)
{
ALWAYS_LOG_IF(m_connection, LOGIDENTIFIER_RECEIVER);
if (transform && m_transform && *transform == *m_transform)
return { };
- if (transform && transform->isAttached())
+ if (!transform) {
+ if (m_transform) {
+ m_transform->detachFromReceiver(*this);
+ m_transform = { };
+ }
+ return { };
+ }
+
+ if (transform->isAttached())
return Exception { InvalidStateError, "transform is already in use"_s };
- if (m_transform)
- m_transform->detachFromReceiver(*this);
+ transform->attachToReceiver(*this, m_transform.get());
m_transform = WTFMove(transform);
- if (m_transform)
- m_transform->attachToReceiver(*this);
return { };
}
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiver.h 2021-04-12 13:15:52 UTC (rev 275819)
@@ -73,7 +73,7 @@
void getStats(Ref<DeferredPromise>&&);
Optional<RTCRtpTransform::Internal> transform();
- ExceptionOr<void> setTransform(Optional<RTCRtpTransform>&&);
+ ExceptionOr<void> setTransform(std::unique_ptr<RTCRtpTransform>&&);
private:
RTCRtpReceiver(PeerConnectionBackend&, Ref<MediaStreamTrack>&&, std::unique_ptr<RTCRtpReceiverBackend>&&);
@@ -88,7 +88,7 @@
Ref<MediaStreamTrack> m_track;
std::unique_ptr<RTCRtpReceiverBackend> m_backend;
WeakPtr<PeerConnectionBackend> m_connection;
- Optional<RTCRtpTransform> m_transform;
+ std::unique_ptr<RTCRtpTransform> m_transform;
#if !RELEASE_LOG_DISABLED
Ref<const Logger> m_logger;
const void* m_logIdentifier { nullptr };
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiverBackend.h (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiverBackend.h 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpReceiverBackend.h 2021-04-12 13:15:52 UTC (rev 275819)
@@ -39,7 +39,7 @@
virtual RTCRtpParameters getParameters() { return { }; }
virtual Vector<RTCRtpContributingSource> getContributingSources() const { return { }; }
virtual Vector<RTCRtpSynchronizationSource> getSynchronizationSources() const { return { }; }
- virtual Ref<RTCRtpTransformBackend> createRTCRtpTransformBackend() = 0;
+ virtual Ref<RTCRtpTransformBackend> rtcRtpTransformBackend() = 0;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransform.cpp (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransform.cpp 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransform.cpp 2021-04-12 13:15:52 UTC (rev 275819)
@@ -76,7 +76,7 @@
RTCRtpScriptTransform::~RTCRtpScriptTransform()
{
- clear();
+ clear(RTCRtpScriptTransformer::ClearCallback::Yes);
}
void RTCRtpScriptTransform::setTransformer(RTCRtpScriptTransformer& transformer)
@@ -107,7 +107,7 @@
void RTCRtpScriptTransform::willClearBackend(RTCRtpTransformBackend&)
{
- clear();
+ clear(RTCRtpScriptTransformer::ClearCallback::Yes);
}
void RTCRtpScriptTransform::initializeTransformer(RTCRtpTransformBackend& backend)
@@ -130,15 +130,15 @@
return true;
}
-void RTCRtpScriptTransform::clear()
+void RTCRtpScriptTransform::clear(RTCRtpScriptTransformer::ClearCallback clearCallback)
{
m_isAttached = false;
auto locker = holdLock(m_transformerLock);
m_isTransformerInitialized = false;
- m_worker->postTaskToWorkerGlobalScope([transformer = WTFMove(m_transformer)](auto&) mutable {
+ m_worker->postTaskToWorkerGlobalScope([transformer = WTFMove(m_transformer), clearCallback](auto&) mutable {
if (transformer)
- transformer->clear();
+ transformer->clear(clearCallback);
});
}
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransform.h (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransform.h 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransform.h 2021-04-12 13:15:52 UTC (rev 275819)
@@ -30,6 +30,7 @@
#include "ActiveDOMObject.h"
#include "EventTarget.h"
#include "MessagePort.h"
+#include "RTCRtpScriptTransformer.h"
#include <_javascript_Core/JSCJSValue.h>
#include <wtf/Lock.h>
#include <wtf/ThreadSafeRefCounted.h>
@@ -57,6 +58,7 @@
void initializeBackendForReceiver(RTCRtpTransformBackend&);
void initializeBackendForSender(RTCRtpTransformBackend&);
void willClearBackend(RTCRtpTransformBackend&);
+ void backendTransferedToNewTransform() { clear(RTCRtpScriptTransformer::ClearCallback::No); }
using ThreadSafeRefCounted::ref;
using ThreadSafeRefCounted::deref;
@@ -66,7 +68,7 @@
void initializeTransformer(RTCRtpTransformBackend&);
bool setupTransformer(Ref<RTCRtpTransformBackend>&&);
- void clear();
+ void clear(RTCRtpScriptTransformer::ClearCallback);
// ActiveDOMObject
const char* activeDOMObjectName() const { return "RTCRtpScriptTransform"; }
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.cpp (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.cpp 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.cpp 2021-04-12 13:15:52 UTC (rev 275819)
@@ -130,9 +130,9 @@
});
}
-void RTCRtpScriptTransformer::clear()
+void RTCRtpScriptTransformer::clear(ClearCallback clearCallback)
{
- if (m_backend)
+ if (m_backend && clearCallback == ClearCallback::Yes)
m_backend->clearTransformableFrameCallback();
m_backend = nullptr;
stopPendingActivity();
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.h (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.h 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpScriptTransformer.h 2021-04-12 13:15:52 UTC (rev 275819)
@@ -61,8 +61,10 @@
void startPendingActivity() { m_pendingActivity = makePendingActivity(*this); }
void start(Ref<RTCRtpTransformBackend>&&);
- void clear();
+ enum class ClearCallback { No, Yes};
+ void clear(ClearCallback);
+
private:
RTCRtpScriptTransformer(ScriptExecutionContext&, Ref<SerializedScriptValue>&&, Ref<MessagePort>&&, Ref<ReadableStream>&&, Ref<SimpleReadableStreamSource>&&);
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.cpp 2021-04-12 13:15:52 UTC (rev 275819)
@@ -223,20 +223,25 @@
return senderTransceiver->currentDirection();
}
-ExceptionOr<void> RTCRtpSender::setTransform(Optional<RTCRtpTransform>&& transform)
+ExceptionOr<void> RTCRtpSender::setTransform(std::unique_ptr<RTCRtpTransform>&& transform)
{
ALWAYS_LOG_IF(m_connection, LOGIDENTIFIER_SENDER);
if (transform && m_transform && *transform == *m_transform)
return { };
- if (transform && transform->isAttached())
+ if (!transform) {
+ if (m_transform) {
+ m_transform->detachFromSender(*this);
+ m_transform = { };
+ }
+ return { };
+ }
+
+ if (transform->isAttached())
return Exception { InvalidStateError, "transform is already in use"_s };
- if (m_transform)
- m_transform->detachFromSender(*this);
+ transform->attachToSender(*this, m_transform.get());
m_transform = WTFMove(transform);
- if (m_transform)
- m_transform->attachToSender(*this);
return { };
}
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSender.h 2021-04-12 13:15:52 UTC (rev 275819)
@@ -90,7 +90,7 @@
Optional<RTCRtpTransceiverDirection> currentTransceiverDirection() const;
Optional<RTCRtpTransform::Internal> transform();
- ExceptionOr<void> setTransform(Optional<RTCRtpTransform>&&);
+ ExceptionOr<void> setTransform(std::unique_ptr<RTCRtpTransform>&&);
private:
RTCRtpSender(RTCPeerConnection&, String&& trackKind, std::unique_ptr<RTCRtpSenderBackend>&&);
@@ -108,7 +108,7 @@
std::unique_ptr<RTCRtpSenderBackend> m_backend;
WeakPtr<RTCPeerConnection> m_connection;
RefPtr<RTCDTMFSender> m_dtmfSender;
- Optional<RTCRtpTransform> m_transform;
+ std::unique_ptr<RTCRtpTransform> m_transform;
#if !RELEASE_LOG_DISABLED
Ref<const Logger> m_logger;
const void* m_logIdentifier { nullptr };
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpSenderBackend.h 2021-04-12 13:15:52 UTC (rev 275819)
@@ -49,7 +49,7 @@
virtual RTCRtpSendParameters getParameters() const = 0;
virtual void setParameters(const RTCRtpSendParameters&, DOMPromiseDeferred<void>&&) = 0;
virtual std::unique_ptr<RTCDTMFSenderBackend> createDTMFBackend() = 0;
- virtual Ref<RTCRtpTransformBackend> createRTCRtpTransformBackend() = 0;
+ virtual Ref<RTCRtpTransformBackend> rtcRtpTransformBackend() = 0;
virtual void setMediaStreamIds(const Vector<String>&) = 0;
};
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransform.cpp (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransform.cpp 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransform.cpp 2021-04-12 13:15:52 UTC (rev 275819)
@@ -33,11 +33,11 @@
namespace WebCore {
-Optional<RTCRtpTransform> RTCRtpTransform::from(Optional<Internal>&& internal)
+std::unique_ptr<RTCRtpTransform> RTCRtpTransform::from(Optional<Internal>&& internal)
{
if (!internal)
- return { };
- return RTCRtpTransform(WTFMove(*internal));
+ return nullptr;
+ return makeUnique<RTCRtpTransform>(WTFMove(*internal));
}
RTCRtpTransform::RTCRtpTransform(Internal&& transform)
@@ -59,34 +59,52 @@
});
}
-void RTCRtpTransform::attachToReceiver(RTCRtpReceiver& receiver)
+void RTCRtpTransform::attachToReceiver(RTCRtpReceiver& receiver, RTCRtpTransform* previousTransform)
{
ASSERT(!isAttached());
- if (auto* backend = receiver.backend())
- m_backend = backend->createRTCRtpTransformBackend();
- if (m_backend) {
- switchOn(m_transform, [&](RefPtr<RTCRtpSFrameTransform>& sframeTransform) {
- sframeTransform->initializeBackendForReceiver(*m_backend);
- }, [&](RefPtr<RTCRtpScriptTransform>& scriptTransform) {
- scriptTransform->initializeBackendForReceiver(*m_backend);
- });
- }
+
+ if (previousTransform)
+ m_backend = previousTransform->takeBackend();
+ else if (auto* backend = receiver.backend())
+ m_backend = backend->rtcRtpTransformBackend();
+ else
+ return;
+
+ switchOn(m_transform, [&](RefPtr<RTCRtpSFrameTransform>& sframeTransform) {
+ sframeTransform->initializeBackendForReceiver(*m_backend);
+ }, [&](RefPtr<RTCRtpScriptTransform>& scriptTransform) {
+ scriptTransform->initializeBackendForReceiver(*m_backend);
+ });
}
-void RTCRtpTransform::attachToSender(RTCRtpSender& sender)
+void RTCRtpTransform::attachToSender(RTCRtpSender& sender, RTCRtpTransform* previousTransform)
{
ASSERT(!isAttached());
- if (auto* backend = sender.backend())
- m_backend = backend->createRTCRtpTransformBackend();
- if (m_backend) {
- switchOn(m_transform, [&](RefPtr<RTCRtpSFrameTransform>& sframeTransform) {
- sframeTransform->initializeBackendForSender(*m_backend);
- }, [&](RefPtr<RTCRtpScriptTransform>& scriptTransform) {
- scriptTransform->initializeBackendForSender(*m_backend);
- });
- }
+
+ if (previousTransform)
+ m_backend = previousTransform->takeBackend();
+ else if (auto* backend = sender.backend())
+ m_backend = backend->rtcRtpTransformBackend();
+ else
+ return;
+
+ switchOn(m_transform, [&](RefPtr<RTCRtpSFrameTransform>& sframeTransform) {
+ sframeTransform->initializeBackendForSender(*m_backend);
+ }, [&](RefPtr<RTCRtpScriptTransform>& scriptTransform) {
+ scriptTransform->initializeBackendForSender(*m_backend);
+ if (previousTransform)
+ previousTransform->backendTransferedToNewTransform();
+ });
}
+void RTCRtpTransform::backendTransferedToNewTransform()
+{
+ switchOn(m_transform, [&](RefPtr<RTCRtpSFrameTransform>&) {
+ }, [&](RefPtr<RTCRtpScriptTransform>& scriptTransform) {
+ scriptTransform->backendTransferedToNewTransform();
+ });
+}
+
void RTCRtpTransform::clearBackend()
{
if (!m_backend)
Modified: trunk/Source/WebCore/Modules/mediastream/RTCRtpTransform.h (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/RTCRtpTransform.h 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/RTCRtpTransform.h 2021-04-12 13:15:52 UTC (rev 275819)
@@ -30,6 +30,7 @@
#include "RTCRtpSFrameTransform.h"
#include "RTCRtpScriptTransform.h"
#include "RTCRtpTransformBackend.h"
+#include <wtf/FastMalloc.h>
namespace WebCore {
@@ -37,19 +38,21 @@
class RTCRtpSender;
class RTCRtpTransform {
+ WTF_MAKE_FAST_ALLOCATED;
public:
using Internal = Variant<RefPtr<RTCRtpSFrameTransform>, RefPtr<RTCRtpScriptTransform>>;
- static Optional<RTCRtpTransform> from(Optional<Internal>&&);
+ static std::unique_ptr<RTCRtpTransform> from(Optional<Internal>&&);
explicit RTCRtpTransform(Internal&&);
~RTCRtpTransform();
bool isAttached() const;
- void attachToReceiver(RTCRtpReceiver&);
- void attachToSender(RTCRtpSender&);
+ void attachToReceiver(RTCRtpReceiver&, RTCRtpTransform*);
+ void attachToSender(RTCRtpSender&, RTCRtpTransform*);
void detachFromReceiver(RTCRtpReceiver&);
void detachFromSender(RTCRtpSender&);
+ RefPtr<RTCRtpTransformBackend> takeBackend() { return WTFMove(m_backend); }
Internal internalTransform() { return m_transform; }
friend bool operator==(const RTCRtpTransform&, const RTCRtpTransform&);
@@ -56,6 +59,7 @@
private:
void clearBackend();
+ void backendTransferedToNewTransform();
RefPtr<RTCRtpTransformBackend> m_backend;
Internal m_transform;
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp 2021-04-12 13:15:52 UTC (rev 275819)
@@ -116,9 +116,11 @@
RELEASE_ASSERT_NOT_REACHED();
}
-Ref<RTCRtpTransformBackend> LibWebRTCRtpReceiverBackend::createRTCRtpTransformBackend()
+Ref<RTCRtpTransformBackend> LibWebRTCRtpReceiverBackend::rtcRtpTransformBackend()
{
- return LibWebRTCRtpReceiverTransformBackend::create(m_rtcReceiver);
+ if (!m_transformBackend)
+ m_transformBackend = LibWebRTCRtpReceiverTransformBackend::create(m_rtcReceiver);
+ return *m_transformBackend;
}
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h 2021-04-12 13:15:52 UTC (rev 275819)
@@ -52,9 +52,10 @@
RTCRtpParameters getParameters() final;
Vector<RTCRtpContributingSource> getContributingSources() const final;
Vector<RTCRtpSynchronizationSource> getSynchronizationSources() const final;
- Ref<RTCRtpTransformBackend> createRTCRtpTransformBackend() final;
+ Ref<RTCRtpTransformBackend> rtcRtpTransformBackend() final;
rtc::scoped_refptr<webrtc::RtpReceiverInterface> m_rtcReceiver;
+ RefPtr<RTCRtpTransformBackend> m_transformBackend;
};
} // namespace WebCore
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.cpp 2021-04-12 13:15:52 UTC (rev 275819)
@@ -39,6 +39,12 @@
namespace WebCore {
+LibWebRTCRtpSenderBackend::LibWebRTCRtpSenderBackend(LibWebRTCPeerConnectionBackend& backend, rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender)
+ : m_peerConnectionBackend(makeWeakPtr(&backend))
+ , m_rtcSender(WTFMove(rtcSender))
+{
+}
+
LibWebRTCRtpSenderBackend::LibWebRTCRtpSenderBackend(LibWebRTCPeerConnectionBackend& backend, rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender, Source&& source)
: m_peerConnectionBackend(makeWeakPtr(&backend))
, m_rtcSender(WTFMove(rtcSender))
@@ -154,9 +160,11 @@
return makeUnique<LibWebRTCDTMFSenderBackend>(m_rtcSender->GetDtmfSender());
}
-Ref<RTCRtpTransformBackend> LibWebRTCRtpSenderBackend::createRTCRtpTransformBackend()
+Ref<RTCRtpTransformBackend> LibWebRTCRtpSenderBackend::rtcRtpTransformBackend()
{
- return LibWebRTCRtpSenderTransformBackend::create(m_rtcSender);
+ if (!m_transformBackend)
+ m_transformBackend = LibWebRTCRtpSenderTransformBackend::create(m_rtcSender);
+ return *m_transformBackend;
}
void LibWebRTCRtpSenderBackend::setMediaStreamIds(const Vector<String>& streamIds)
Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h (275818 => 275819)
--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h 2021-04-12 12:26:44 UTC (rev 275818)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpSenderBackend.h 2021-04-12 13:15:52 UTC (rev 275819)
@@ -47,14 +47,9 @@
class LibWebRTCRtpSenderBackend final : public RTCRtpSenderBackend, public CanMakeWeakPtr<LibWebRTCRtpSenderBackend> {
WTF_MAKE_FAST_ALLOCATED;
public:
- LibWebRTCRtpSenderBackend(LibWebRTCPeerConnectionBackend& backend, rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender)
- : m_peerConnectionBackend(makeWeakPtr(&backend))
- , m_rtcSender(WTFMove(rtcSender))
- {
- }
-
using Source = Variant<std::nullptr_t, Ref<RealtimeOutgoingAudioSource>, Ref<RealtimeOutgoingVideoSource>>;
LibWebRTCRtpSenderBackend(LibWebRTCPeerConnectionBackend&, rtc::scoped_refptr<webrtc::RtpSenderInterface>&&, Source&&);
+ LibWebRTCRtpSenderBackend(LibWebRTCPeerConnectionBackend&, rtc::scoped_refptr<webrtc::RtpSenderInterface>&&);
~LibWebRTCRtpSenderBackend();
void setRTCSender(rtc::scoped_refptr<webrtc::RtpSenderInterface>&& rtcSender) { m_rtcSender = WTFMove(rtcSender); }
@@ -70,7 +65,7 @@
RTCRtpSendParameters getParameters() const final;
void setParameters(const RTCRtpSendParameters&, DOMPromiseDeferred<void>&&) final;
std::unique_ptr<RTCDTMFSenderBackend> createDTMFBackend() final;
- Ref<RTCRtpTransformBackend> createRTCRtpTransformBackend() final;
+ Ref<RTCRtpTransformBackend> rtcRtpTransformBackend() final;
void setMediaStreamIds(const Vector<String>&) final;
void startSource();
@@ -80,6 +75,7 @@
WeakPtr<LibWebRTCPeerConnectionBackend> m_peerConnectionBackend;
rtc::scoped_refptr<webrtc::RtpSenderInterface> m_rtcSender;
Source m_source;
+ RefPtr<RTCRtpTransformBackend> m_transformBackend;
mutable Optional<webrtc::RtpParameters> m_currentParameters;
};