Title: [235869] trunk
Revision
235869
Author
[email protected]
Date
2018-09-10 15:47:09 -0700 (Mon, 10 Sep 2018)

Log Message

ontrack events should be fired even if an existing transceiver exists
https://bugs.webkit.org/show_bug.cgi?id=189477

Reviewed by Eric Carlson.

Source/WebCore:

In case of an OnTrack callback from libwebrtc, make sure the ontrack event is called even if a transceiver already exists for that track.

Covered by updated video-addTransceiver.html
New test video-addLegacyTransceiver.html keeps testing the old transceiver behavior.
Test: webrtc/video-addLegacyTransceiver.html

* Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
(WebCore::LibWebRTCMediaEndpoint::newTransceiver):

LayoutTests:

* webrtc/video-addLegacyTransceiver-expected.txt: Added.
* webrtc/video-addLegacyTransceiver.html: Copied from LayoutTests/webrtc/video-addTransceiver.html.
* webrtc/video-addTransceiver.html:

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (235868 => 235869)


--- trunk/LayoutTests/ChangeLog	2018-09-10 22:23:05 UTC (rev 235868)
+++ trunk/LayoutTests/ChangeLog	2018-09-10 22:47:09 UTC (rev 235869)
@@ -1,3 +1,14 @@
+2018-09-10  Youenn Fablet  <[email protected]>
+
+        ontrack events should be fired even if an existing transceiver exists
+        https://bugs.webkit.org/show_bug.cgi?id=189477
+
+        Reviewed by Eric Carlson.
+
+        * webrtc/video-addLegacyTransceiver-expected.txt: Added.
+        * webrtc/video-addLegacyTransceiver.html: Copied from LayoutTests/webrtc/video-addTransceiver.html.
+        * webrtc/video-addTransceiver.html:
+
 2018-09-10  Megan Gardner  <[email protected]>
 
         Correctly interpret from angle for conic gradients

Added: trunk/LayoutTests/webrtc/video-addLegacyTransceiver-expected.txt (0 => 235869)


--- trunk/LayoutTests/webrtc/video-addLegacyTransceiver-expected.txt	                        (rev 0)
+++ trunk/LayoutTests/webrtc/video-addLegacyTransceiver-expected.txt	2018-09-10 22:47:09 UTC (rev 235869)
@@ -0,0 +1,6 @@
+
+
+PASS Setting up calls with addTransceiver but with no track 
+PASS Setting up calls with addTransceiver with a track 
+PASS Basic video exchange set up with addTransceiver 
+

Copied: trunk/LayoutTests/webrtc/video-addLegacyTransceiver.html (from rev 235868, trunk/LayoutTests/webrtc/video-addTransceiver.html) (0 => 235869)


--- trunk/LayoutTests/webrtc/video-addLegacyTransceiver.html	                        (rev 0)
+++ trunk/LayoutTests/webrtc/video-addLegacyTransceiver.html	2018-09-10 22:47:09 UTC (rev 235869)
@@ -0,0 +1,101 @@
+<!doctype html>
+<html>
+    <head>
+        <meta charset="utf-8">
+        <title>Testing basic video exchange from offerer to receiver</title>
+        <script src=""
+        <script src=""
+    </head>
+    <body>
+        <video id="video" autoplay=""></video>
+        <canvas id="canvas" width="640" height="480"></canvas>
+        <script src =""
+        <script>
+if (window.testRunner)
+    testRunner.setWebRTCUnifiedPlanEnabled(false);
+
+promise_test((test) => {
+    var pc = new RTCPeerConnection();
+    pc.addTransceiver("video");
+
+    return pc.createOffer().then((offer) => {
+        assert_true(offer.sdp.indexOf("mid:video") !== -1);
+        assert_true(offer.sdp.indexOf("a=recvonly") !== -1);
+
+        pc.addTransceiver("audio");
+        return pc.createOffer();
+    }).then((offer) => {
+        assert_true(offer.sdp.indexOf("mid:audio") !== -1);
+    });
+}, "Setting up calls with addTransceiver but with no track");
+
+promise_test((test) => {
+    if (window.testRunner)
+        testRunner.setUserMediaPermission(true);
+
+    return navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => {
+        var pc = new RTCPeerConnection();
+        pc.addTransceiver("video");
+        pc.getSenders()[0].replaceTrack(stream.getVideoTracks()[0]);
+
+        return pc.createOffer().then((offer) => {
+            assert_true(offer.sdp.indexOf("mid:video") !== -1);
+            // Replacing the track is not done yet so we still set it as a recvonly.
+            assert_true(offer.sdp.indexOf("a=recvonly") !== -1);
+        });
+    });
+}, "Setting up calls with addTransceiver with a track");
+
+function testImage()
+{
+    canvas.width = video.videoWidth;
+    canvas.height = video.videoHeight;
+    canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
+
+    imageData = canvas.getContext('2d').getImageData(10, 325, 250, 1);
+    data = ""
+
+    var index = 20;
+    assert_true(data[index] < 100);
+    assert_true(data[index + 1] < 100);
+    assert_true(data[index + 2] < 100);
+
+    index = 80;
+    assert_true(data[index] > 200);
+    assert_true(data[index + 1] > 200);
+    assert_true(data[index + 2] > 200);
+
+    index += 80;
+    assert_true(data[index] > 200);
+    assert_true(data[index + 1] > 200);
+    assert_true(data[index + 2] < 100);
+}
+
+promise_test((test) => {
+    if (window.testRunner)
+        testRunner.setUserMediaPermission(true);
+
+    return navigator.mediaDevices.getUserMedia({ video: true}).then((stream) => {
+        return new Promise((resolve, reject) => {
+            createConnections((firstConnection) => {
+                var track = stream.getVideoTracks()[0];
+                firstConnection.addTransceiver("video");
+                return firstConnection.getSenders()[0].replaceTrack(stream.getVideoTracks()[0]);
+            }, (secondConnection) => {
+                secondConnection._ontrack_ = (trackEvent) => {
+                    resolve(trackEvent.streams[0]);
+                };
+            });
+            setTimeout(() => reject("Test timed out"), 5000);
+        });
+    }).then((stream) => {
+        video.srcObject = stream;
+        return video.play();
+    }).then(() => {
+        testImage();
+    });
+}, "Basic video exchange set up with addTransceiver");
+
+        </script>
+    </body>
+</html>

Modified: trunk/LayoutTests/webrtc/video-addTransceiver.html (235868 => 235869)


--- trunk/LayoutTests/webrtc/video-addTransceiver.html	2018-09-10 22:23:05 UTC (rev 235868)
+++ trunk/LayoutTests/webrtc/video-addTransceiver.html	2018-09-10 22:47:09 UTC (rev 235869)
@@ -11,39 +11,32 @@
         <canvas id="canvas" width="640" height="480"></canvas>
         <script src =""
         <script>
-if (window.testRunner)
-    testRunner.setWebRTCUnifiedPlanEnabled(false);
-
-promise_test((test) => {
+promise_test(async (test) => {
     var pc = new RTCPeerConnection();
     pc.addTransceiver("video");
 
-    return pc.createOffer().then((offer) => {
-        assert_true(offer.sdp.indexOf("mid:video") !== -1);
-        assert_true(offer.sdp.indexOf("a=recvonly") !== -1);
+    let offer = await pc.createOffer();
+    assert_true(offer.sdp.indexOf("m=video") !== -1, "mid");
+    assert_true(offer.sdp.indexOf("a=sendrecv") !== -1, "recvonly");
 
-        pc.addTransceiver("audio");
-        return pc.createOffer();
-    }).then((offer) => {
-        assert_true(offer.sdp.indexOf("mid:audio") !== -1);
-    });
+    pc.addTransceiver("audio");
+    offer = await pc.createOffer();
+    assert_true(offer.sdp.indexOf("m=audio") !== -1, "m=audio");
 }, "Setting up calls with addTransceiver but with no track");
 
-promise_test((test) => {
+promise_test(async (test) => {
     if (window.testRunner)
         testRunner.setUserMediaPermission(true);
 
-    return navigator.mediaDevices.getUserMedia({ video: true }).then((stream) => {
-        var pc = new RTCPeerConnection();
-        pc.addTransceiver("video");
-        pc.getSenders()[0].replaceTrack(stream.getVideoTracks()[0]);
+    const stream = await navigator.mediaDevices.getUserMedia({ video: true });
+    var pc = new RTCPeerConnection();
+    pc.addTransceiver("video", {direction:"recvonly"});
+    pc.getSenders()[0].replaceTrack(stream.getVideoTracks()[0]);
 
-        return pc.createOffer().then((offer) => {
-            assert_true(offer.sdp.indexOf("mid:video") !== -1);
-            // Replacing the track is not done yet so we still set it as a recvonly.
-            assert_true(offer.sdp.indexOf("a=recvonly") !== -1);
-        });
-    });
+    const offer = await pc.createOffer();
+    assert_true(offer.sdp.indexOf("m=video") !== -1, "m=video");
+    // Replacing the track is not done yet so we still set it as a recvonly.
+    assert_true(offer.sdp.indexOf("a=recvonly") !== -1, "a=recvonly");
 }, "Setting up calls with addTransceiver with a track");
 
 function testImage()
@@ -71,29 +64,27 @@
     assert_true(data[index + 2] < 100);
 }
 
-promise_test((test) => {
+promise_test(async (test) => {
     if (window.testRunner)
         testRunner.setUserMediaPermission(true);
 
-    return navigator.mediaDevices.getUserMedia({ video: true}).then((stream) => {
-        return new Promise((resolve, reject) => {
-            createConnections((firstConnection) => {
-                var track = stream.getVideoTracks()[0];
-                firstConnection.addTransceiver("video");
-                return firstConnection.getSenders()[0].replaceTrack(stream.getVideoTracks()[0]);
-            }, (secondConnection) => {
-                secondConnection._ontrack_ = (trackEvent) => {
-                    resolve(trackEvent.streams[0]);
-                };
-            });
-            setTimeout(() => reject("Test timed out"), 5000);
+    const stream = await navigator.mediaDevices.getUserMedia({ video: true});
+    const track = await new Promise((resolve, reject) => {
+        createConnections((firstConnection) => {
+            var track = stream.getVideoTracks()[0];
+            firstConnection.addTransceiver("video");
+            return firstConnection.getSenders()[0].replaceTrack(stream.getVideoTracks()[0]);
+        }, (secondConnection) => {
+            secondConnection.addTransceiver("video");
+            secondConnection._ontrack_ = (trackEvent) => {
+                resolve(trackEvent.track);
+            };
         });
-    }).then((stream) => {
-        video.srcObject = stream;
-        return video.play();
-    }).then(() => {
-        testImage();
+        setTimeout(() => reject("Test timed out"), 5000);
     });
+    video.srcObject = new MediaStream([track]);
+    await video.play();
+    testImage();
 }, "Basic video exchange set up with addTransceiver");
 
         </script>

Modified: trunk/Source/WebCore/ChangeLog (235868 => 235869)


--- trunk/Source/WebCore/ChangeLog	2018-09-10 22:23:05 UTC (rev 235868)
+++ trunk/Source/WebCore/ChangeLog	2018-09-10 22:47:09 UTC (rev 235869)
@@ -1,3 +1,19 @@
+2018-09-10  Youenn Fablet  <[email protected]>
+
+        ontrack events should be fired even if an existing transceiver exists
+        https://bugs.webkit.org/show_bug.cgi?id=189477
+
+        Reviewed by Eric Carlson.
+
+        In case of an OnTrack callback from libwebrtc, make sure the ontrack event is called even if a transceiver already exists for that track.
+
+        Covered by updated video-addTransceiver.html
+        New test video-addLegacyTransceiver.html keeps testing the old transceiver behavior.
+        Test: webrtc/video-addLegacyTransceiver.html
+
+        * Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp:
+        (WebCore::LibWebRTCMediaEndpoint::newTransceiver):
+
 2018-09-10  Megan Gardner  <[email protected]>
 
         Correctly interpret from angle for conic gradients

Modified: trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp (235868 => 235869)


--- trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2018-09-10 22:23:05 UTC (rev 235868)
+++ trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCMediaEndpoint.cpp	2018-09-10 22:47:09 UTC (rev 235869)
@@ -427,7 +427,9 @@
         return rtcTransceiver.get() == transceiverBackend.rtcTransceiver();
     });
     if (transceiver) {
-        setExistingReceiverSourceTrack(transceiver->receiver().track().source(), *rtcTransceiver->receiver());
+        auto rtcReceiver = rtcTransceiver->receiver();
+        setExistingReceiverSourceTrack(transceiver->receiver().track().source(), *rtcReceiver);
+        fireTrackEvent(makeRef(transceiver->receiver()), transceiver->receiver().track(), rtcReceiver->streams(), makeRef(*transceiver));
         return;
     }
 
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to