Title: [275819] trunk
Revision
275819
Author
[email protected]
Date
2021-04-12 06:15:52 -0700 (Mon, 12 Apr 2021)

Log Message

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.

Source/WebCore:

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:

LayoutTests:

* 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):

Modified Paths

Added Paths

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;
 };
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to