Title: [291095] trunk/Source
Revision
291095
Author
[email protected]
Date
2022-03-10 01:08:01 -0800 (Thu, 10 Mar 2022)

Log Message

Remove RemoteVideoSample
https://bugs.webkit.org/show_bug.cgi?id=237592

Reviewed by Eric Carlson.

Source/WebCore:

No change of behavior.

* Headers.cmake:
* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* platform/graphics/RemoteVideoSample.cpp: Removed.
* platform/graphics/RemoteVideoSample.h: Removed.

Source/WebKit:

Send RemoteVideoSample data directly as IPC message parameters instead of inside RemoteVideoSample.
Fix timeStampNs by sending them back to WebProcess and divide them by 1000 to put them as milliseconds, as expected by libwebrtc backend.

* GPUProcess/webrtc/LibWebRTCCodecsProxy.h:
* GPUProcess/webrtc/LibWebRTCCodecsProxy.mm:
(WebKit::LibWebRTCCodecsProxy::createDecoderCallback):
* UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
* WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp:
(WebKit::LibWebRTCCodecs::completedDecodingCV):
* WebProcess/GPU/webrtc/LibWebRTCCodecs.h:
* WebProcess/GPU/webrtc/LibWebRTCCodecs.messages.in:
* WebProcess/cocoa/RemoteCaptureSampleManager.cpp:
(WebKit::RemoteCaptureSampleManager::videoFrameAvailable):
(WebKit::RemoteCaptureSampleManager::videoFrameAvailableCV):
(WebKit::RemoteCaptureSampleManager::videoSampleAvailable): Deleted.
(WebKit::RemoteCaptureSampleManager::videoSampleAvailableCV): Deleted.
(WebKit::RemoteCaptureSampleManager::RemoteVideo::videoSampleAvailable): Deleted.
* WebProcess/cocoa/RemoteCaptureSampleManager.h:
* WebProcess/cocoa/RemoteCaptureSampleManager.messages.in:
* WebProcess/cocoa/RemoteRealtimeVideoSource.cpp:

Modified Paths

Removed Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (291094 => 291095)


--- trunk/Source/WebCore/ChangeLog	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebCore/ChangeLog	2022-03-10 09:08:01 UTC (rev 291095)
@@ -1,3 +1,18 @@
+2022-03-10  Youenn Fablet  <[email protected]>
+
+        Remove RemoteVideoSample
+        https://bugs.webkit.org/show_bug.cgi?id=237592
+
+        Reviewed by Eric Carlson.
+
+        No change of behavior.
+
+        * Headers.cmake:
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * platform/graphics/RemoteVideoSample.cpp: Removed.
+        * platform/graphics/RemoteVideoSample.h: Removed.
+
 2022-03-10  Carlos Garcia Campos  <[email protected]>
 
         [GTK][WPE] Add initial support for PDF documents using PDF.js

Modified: trunk/Source/WebCore/Headers.cmake (291094 => 291095)


--- trunk/Source/WebCore/Headers.cmake	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebCore/Headers.cmake	2022-03-10 09:08:01 UTC (rev 291095)
@@ -1564,7 +1564,6 @@
     platform/graphics/PlatformVideoTrackConfiguration.h
     platform/graphics/PlatformVideoTransferCharacteristics.h
     platform/graphics/Region.h
-    platform/graphics/RemoteVideoSample.h
     platform/graphics/RenderingResourceIdentifier.h
     platform/graphics/RenderingMode.h
     platform/graphics/RoundedRect.h

Modified: trunk/Source/WebCore/Sources.txt (291094 => 291095)


--- trunk/Source/WebCore/Sources.txt	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebCore/Sources.txt	2022-03-10 09:08:01 UTC (rev 291095)
@@ -2081,7 +2081,6 @@
 platform/graphics/PixelFormat.cpp
 platform/graphics/PlatformTimeRanges.cpp
 platform/graphics/Region.cpp
-platform/graphics/RemoteVideoSample.cpp
 platform/graphics/RoundedRect.cpp
 platform/graphics/ShadowBlur.cpp
 platform/graphics/SourceBufferPrivate.cpp

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (291094 => 291095)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2022-03-10 09:08:01 UTC (rev 291095)
@@ -120,7 +120,6 @@
 		073794FE19F5864E00E5A045 /* RTCNotifiersMock.h in Headers */ = {isa = PBXBuildFile; fileRef = 073794F819F5864E00E5A045 /* RTCNotifiersMock.h */; };
 		0738E5EC2499839000DA101C /* AVOutputDeviceMenuControllerTargetPicker.mm in Sources */ = {isa = PBXBuildFile; fileRef = 0738E5EA249968AD00DA101C /* AVOutputDeviceMenuControllerTargetPicker.mm */; };
 		073955BB27AB277F009A08D2 /* ScreenCaptureKitSharingSessionManager.h in Headers */ = {isa = PBXBuildFile; fileRef = 07035D3227A9B60B00FB03E4 /* ScreenCaptureKitSharingSessionManager.h */; settings = {ATTRIBUTES = (Private, ); }; };
-		073A15542177A42600EA08F2 /* RemoteVideoSample.h in Headers */ = {isa = PBXBuildFile; fileRef = 073A15532177A39A00EA08F2 /* RemoteVideoSample.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		073B87671E4385AC0071C0EC /* AudioSampleBufferList.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87631E43859D0071C0EC /* AudioSampleBufferList.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		073B87691E4385AC0071C0EC /* AudioSampleDataSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 073B87651E43859D0071C0EC /* AudioSampleDataSource.h */; settings = {ATTRIBUTES = (Private, ); }; };
 		0740B14425DE31F800E38DBA /* MockMediaSessionCoordinator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0740B14325DE31A900E38DBA /* MockMediaSessionCoordinator.cpp */; };
@@ -6085,8 +6084,6 @@
 		0738E5E8249968AC00DA101C /* AVOutputDeviceMenuControllerTargetPicker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AVOutputDeviceMenuControllerTargetPicker.h; sourceTree = "<group>"; };
 		0738E5EA249968AD00DA101C /* AVOutputDeviceMenuControllerTargetPicker.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = AVOutputDeviceMenuControllerTargetPicker.mm; sourceTree = "<group>"; };
 		0738E5EB2499690900DA101C /* AVPlaybackTargetPicker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AVPlaybackTargetPicker.h; sourceTree = "<group>"; };
-		073A15512177A39800EA08F2 /* RemoteVideoSample.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteVideoSample.cpp; sourceTree = "<group>"; };
-		073A15532177A39A00EA08F2 /* RemoteVideoSample.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RemoteVideoSample.h; sourceTree = "<group>"; };
 		073B87561E40DCE50071C0EC /* AudioStreamDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioStreamDescription.h; sourceTree = "<group>"; };
 		073B87571E40DCFD0071C0EC /* CAAudioStreamDescription.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CAAudioStreamDescription.cpp; sourceTree = "<group>"; };
 		073B87581E40DCFD0071C0EC /* CAAudioStreamDescription.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CAAudioStreamDescription.h; sourceTree = "<group>"; };
@@ -29163,8 +29160,6 @@
 				CD1F9AFC26FD38CA00617EB6 /* PlatformVideoTransferCharacteristics.h */,
 				BCAB417F13E356E800D8AAF3 /* Region.cpp */,
 				BCAB418013E356E800D8AAF3 /* Region.h */,
-				073A15512177A39800EA08F2 /* RemoteVideoSample.cpp */,
-				073A15532177A39A00EA08F2 /* RemoteVideoSample.h */,
 				7299BC6623D686C600CC6883 /* RenderingMode.h */,
 				729D052E25313E2600422098 /* RenderingResourceIdentifier.h */,
 				A73F95FC12C97BFE0031AAF9 /* RoundedRect.cpp */,
@@ -36888,7 +36883,6 @@
 				46B9519A207D635400A7D2DD /* RemoteFrame.h in Headers */,
 				CDC312E922FCD7C0001204EC /* RemotePlayback.h in Headers */,
 				CDC312EB22FCD7C9001204EC /* RemotePlaybackAvailabilityCallback.h in Headers */,
-				073A15542177A42600EA08F2 /* RemoteVideoSample.h in Headers */,
 				D06C0D8F0CFD11460065F43F /* RemoveFormatCommand.h in Headers */,
 				93309E05099E64920056E581 /* RemoveNodeCommand.h in Headers */,
 				93309E07099E64920056E581 /* RemoveNodePreservingChildrenCommand.h in Headers */,

Deleted: trunk/Source/WebCore/platform/graphics/RemoteVideoSample.cpp (291094 => 291095)


--- trunk/Source/WebCore/platform/graphics/RemoteVideoSample.cpp	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebCore/platform/graphics/RemoteVideoSample.cpp	2022-03-10 09:08:01 UTC (rev 291095)
@@ -1,156 +0,0 @@
-/*
- * Copyright (C) 2018 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "config.h"
-#include "RemoteVideoSample.h"
-
-#if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
-
-#include "GraphicsContextCG.h"
-#include "IOSurface.h"
-#include "Logging.h"
-#include "MediaSampleAVFObjC.h"
-#include "VideoFrameCV.h"
-
-#if USE(ACCELERATE)
-#include <Accelerate/Accelerate.h>
-#endif
-
-#include <pal/cf/CoreMediaSoftLink.h>
-#include "CoreVideoSoftLink.h"
-
-namespace WebCore {
-
-static inline std::unique_ptr<IOSurface> transferBGRAPixelBufferToIOSurface(CVPixelBufferRef pixelBuffer)
-{
-#if USE(ACCELERATE)
-    ASSERT(CVPixelBufferGetPixelFormatType(pixelBuffer) == kCVPixelFormatType_32BGRA);
-
-    auto result = CVPixelBufferLockBaseAddress(pixelBuffer, kCVPixelBufferLock_ReadOnly);
-    ASSERT(result == kCVReturnSuccess);
-    if (result != kCVReturnSuccess) {
-        RELEASE_LOG_ERROR(Media, "transferBGRAPixelBufferToIOSurface CVPixelBufferLockBaseAddress() returned error code %d", result);
-        return nullptr;
-    }
-
-    IntSize size { static_cast<int>(CVPixelBufferGetWidth(pixelBuffer)), static_cast<int>(CVPixelBufferGetHeight(pixelBuffer)) };
-    auto ioSurface = IOSurface::create(size, DestinationColorSpace::SRGB(), IOSurface::Format::BGRA);
-
-    IOSurface::Locker lock(*ioSurface);
-    vImage_Buffer src;
-    src.width = size.width();
-    src.height = size.height();
-    src.rowBytes = CVPixelBufferGetBytesPerRow(pixelBuffer);
-    src.data = ""
-
-    vImage_Buffer dest;
-    dest.width = size.width();
-    dest.height = size.height();
-    dest.rowBytes = ioSurface->bytesPerRow();
-    dest.data = ""
-
-    vImageUnpremultiplyData_BGRA8888(&src, &dest, kvImageNoFlags);
-
-    result = CVPixelBufferUnlockBaseAddress(pixelBuffer, kCVPixelBufferLock_ReadOnly);
-    ASSERT(result == kCVReturnSuccess);
-    if (result != kCVReturnSuccess) {
-        RELEASE_LOG_ERROR(Media, "transferBGRAPixelBufferToIOSurface CVPixelBufferUnlockBaseAddress() returned error code %d", result);
-        return nullptr;
-    }
-    return ioSurface;
-#else
-    RELEASE_LOG_ERROR(Media, "transferBGRAPixelBufferToIOSurface cannot convert to IOSurface");
-    return nullptr;
-#endif
-}
-
-std::unique_ptr<RemoteVideoSample> RemoteVideoSample::create(MediaSample& sample, ShouldCheckForIOSurface shouldCheckForIOSurface)
-{
-    RetainPtr<CVPixelBufferRef> imageBuffer;
-    if (is<MediaSampleAVFObjC>(sample))
-        imageBuffer = downcast<MediaSampleAVFObjC>(sample).pixelBuffer();
-    else if (is<VideoFrameCV>(sample))
-        imageBuffer = downcast<VideoFrameCV>(sample).pixelBuffer();
-    else {
-        RELEASE_LOG_ERROR(Media, "RemoteVideoSample::create: cannot obtain CVPixelBuffer from sample. Unknown sample type.");
-        return nullptr;
-    }
-    if (!imageBuffer) {
-        RELEASE_LOG_ERROR(Media, "RemoteVideoSample::create: cannot obtain CVPixelBuffer from sample. No buffer.");
-        return nullptr;
-    }
-    std::unique_ptr<IOSurface> ioSurface;
-    auto surface = CVPixelBufferGetIOSurface(imageBuffer.get());
-    if (!surface && shouldCheckForIOSurface == ShouldCheckForIOSurface::Yes) {
-        // Special case for canvas data that is RGBA, not IOSurface backed.
-        auto pixelFormatType = CVPixelBufferGetPixelFormatType(imageBuffer.get());
-        if (pixelFormatType != kCVPixelFormatType_32BGRA) {
-            RELEASE_LOG_ERROR(Media, "RemoteVideoSample::create does not support non IOSurface backed samples that are not BGRA");
-            return nullptr;
-        }
-
-        ioSurface = transferBGRAPixelBufferToIOSurface(imageBuffer.get());
-        if (!ioSurface)
-            return nullptr;
-
-        surface = ioSurface->surface();
-    }
-
-    return std::unique_ptr<RemoteVideoSample>(new RemoteVideoSample(surface, WTFMove(imageBuffer), DestinationColorSpace::SRGB(), sample.presentationTime(), sample.videoRotation(), sample.videoMirrored()));
-}
-
-std::unique_ptr<RemoteVideoSample> RemoteVideoSample::create(RetainPtr<CVPixelBufferRef>&& imageBuffer, MediaTime&& presentationTime, MediaSample::VideoRotation rotation, ShouldCheckForIOSurface shouldCheckForIOSurface)
-{
-    auto surface = CVPixelBufferGetIOSurface(imageBuffer.get());
-    if (!surface && shouldCheckForIOSurface == ShouldCheckForIOSurface::Yes) {
-        RELEASE_LOG_ERROR(Media, "RemoteVideoSample::create: CVPixelBufferGetIOSurface returned nullptr");
-        return nullptr;
-    }
-
-    return std::unique_ptr<RemoteVideoSample>(new RemoteVideoSample(surface, WTFMove(imageBuffer), DestinationColorSpace::SRGB(), WTFMove(presentationTime), rotation, false));
-}
-
-RemoteVideoSample::RemoteVideoSample(IOSurfaceRef surface, RetainPtr<CVPixelBufferRef>&& imageBuffer, const DestinationColorSpace& colorSpace, MediaTime&& time, MediaSample::VideoRotation rotation, bool mirrored)
-    : m_ioSurface(WebCore::IOSurface::createFromSurface(surface, colorSpace))
-    , m_imageBuffer(WTFMove(imageBuffer))
-    , m_rotation(rotation)
-    , m_time(WTFMove(time))
-    , m_videoFormat(IOSurfaceGetPixelFormat(surface))
-    , m_size(IntSize(IOSurfaceGetWidth(surface), IOSurfaceGetHeight(surface)))
-    , m_mirrored(mirrored)
-{
-}
-
-IOSurfaceRef RemoteVideoSample::surface() const
-{
-    if (!m_ioSurface && m_sendRight)
-        const_cast<RemoteVideoSample*>(this)->m_ioSurface = WebCore::IOSurface::createFromSendRight(WTFMove(const_cast<RemoteVideoSample*>(this)->m_sendRight), DestinationColorSpace::SRGB());
-
-    return m_ioSurface ? m_ioSurface->surface() : nullptr;
-}
-
-}
-
-#endif // ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)

Deleted: trunk/Source/WebCore/platform/graphics/RemoteVideoSample.h (291094 => 291095)


--- trunk/Source/WebCore/platform/graphics/RemoteVideoSample.h	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebCore/platform/graphics/RemoteVideoSample.h	2022-03-10 09:08:01 UTC (rev 291095)
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2018 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
- * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
- * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
- * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
-
-#include "IOSurface.h"
-#include "MediaSample.h"
-#include "RemoteVideoSample.h"
-#include <wtf/MachSendRight.h>
-#include <wtf/MediaTime.h>
-
-typedef struct __CVBuffer* CVPixelBufferRef;
-
-namespace WebCore {
-
-class ProcessIdentity;
-
-class RemoteVideoSample {
-public:
-    RemoteVideoSample() = default;
-    RemoteVideoSample(RemoteVideoSample&&) = default;
-    RemoteVideoSample& operator=(RemoteVideoSample&&) = default;
-    ~RemoteVideoSample() = default;
-
-    enum class ShouldCheckForIOSurface { No, Yes };
-    WEBCORE_EXPORT static std::unique_ptr<RemoteVideoSample> create(MediaSample&, ShouldCheckForIOSurface = ShouldCheckForIOSurface::Yes);
-    WEBCORE_EXPORT static std::unique_ptr<RemoteVideoSample> create(RetainPtr<CVPixelBufferRef>&&, MediaTime&& presentationTime, MediaSample::VideoRotation = MediaSample::VideoRotation::None, ShouldCheckForIOSurface = ShouldCheckForIOSurface::Yes);
-
-    WEBCORE_EXPORT IOSurfaceRef surface() const;
-    CVPixelBufferRef imageBuffer() const { return m_imageBuffer.get(); }
-
-    void setOwnershipIdentity(const ProcessIdentity&);
-    void clearIOSurface() { m_ioSurface = nullptr; }
-
-    const MediaTime& time() const { return m_time; }
-    uint32_t videoFormat() const { return m_videoFormat; }
-    IntSize size() const { return m_size; }
-    MediaSample::VideoRotation rotation() const { return m_rotation; }
-    bool mirrored() const { return m_mirrored; }
-
-    template<class Encoder> void encode(Encoder& encoder) const
-    {
-        if (m_ioSurface)
-            encoder << m_ioSurface->createSendRight();
-        else
-            encoder << MachSendRight();
-        encoder << m_rotation;
-        encoder << m_time;
-        encoder << m_videoFormat;
-        encoder << m_size;
-        encoder << m_mirrored;
-    }
-
-    template<class Decoder> static WARN_UNUSED_RETURN bool decode(Decoder& decoder, RemoteVideoSample& sample)
-    {
-        MachSendRight sendRight;
-        if (!decoder.decode(sendRight))
-            return false;
-        sample.m_sendRight = WTFMove(sendRight);
-
-        MediaSample::VideoRotation rotation;
-        if (!decoder.decode(rotation))
-            return false;
-        sample.m_rotation = rotation;
-
-        MediaTime time;
-        if (!decoder.decode(time))
-            return false;
-        sample.m_time = WTFMove(time);
-
-        uint32_t format;
-        if (!decoder.decode(format))
-            return false;
-        sample.m_videoFormat = format;
-
-        IntSize size;
-        if (!decoder.decode(size))
-            return false;
-        sample.m_size = WTFMove(size);
-
-        bool mirrored;
-        if (!decoder.decode(mirrored))
-            return false;
-        sample.m_mirrored = mirrored;
-
-        return true;
-    }
-
-private:
-    RemoteVideoSample(IOSurfaceRef, RetainPtr<CVPixelBufferRef>&&, const DestinationColorSpace&, MediaTime&&, MediaSample::VideoRotation, bool);
-
-    std::unique_ptr<WebCore::IOSurface> m_ioSurface;
-    RetainPtr<CVPixelBufferRef> m_imageBuffer;
-    MachSendRight m_sendRight;
-    MediaSample::VideoRotation m_rotation { MediaSample::VideoRotation::None };
-    MediaTime m_time;
-    uint32_t m_videoFormat { 0 };
-    IntSize m_size;
-    bool m_mirrored { false };
-};
-
-inline void RemoteVideoSample::setOwnershipIdentity(const ProcessIdentity& resourceOwner)
-{
-    if (m_ioSurface)
-        m_ioSurface->setOwnershipIdentity(resourceOwner);
-}
-
-}
-
-#endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebKit/ChangeLog (291094 => 291095)


--- trunk/Source/WebKit/ChangeLog	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/ChangeLog	2022-03-10 09:08:01 UTC (rev 291095)
@@ -1,3 +1,31 @@
+2022-03-10  Youenn Fablet  <[email protected]>
+
+        Remove RemoteVideoSample
+        https://bugs.webkit.org/show_bug.cgi?id=237592
+
+        Reviewed by Eric Carlson.
+
+        Send RemoteVideoSample data directly as IPC message parameters instead of inside RemoteVideoSample.
+        Fix timeStampNs by sending them back to WebProcess and divide them by 1000 to put them as milliseconds, as expected by libwebrtc backend.
+
+        * GPUProcess/webrtc/LibWebRTCCodecsProxy.h:
+        * GPUProcess/webrtc/LibWebRTCCodecsProxy.mm:
+        (WebKit::LibWebRTCCodecsProxy::createDecoderCallback):
+        * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
+        * WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp:
+        (WebKit::LibWebRTCCodecs::completedDecodingCV):
+        * WebProcess/GPU/webrtc/LibWebRTCCodecs.h:
+        * WebProcess/GPU/webrtc/LibWebRTCCodecs.messages.in:
+        * WebProcess/cocoa/RemoteCaptureSampleManager.cpp:
+        (WebKit::RemoteCaptureSampleManager::videoFrameAvailable):
+        (WebKit::RemoteCaptureSampleManager::videoFrameAvailableCV):
+        (WebKit::RemoteCaptureSampleManager::videoSampleAvailable): Deleted.
+        (WebKit::RemoteCaptureSampleManager::videoSampleAvailableCV): Deleted.
+        (WebKit::RemoteCaptureSampleManager::RemoteVideo::videoSampleAvailable): Deleted.
+        * WebProcess/cocoa/RemoteCaptureSampleManager.h:
+        * WebProcess/cocoa/RemoteCaptureSampleManager.messages.in:
+        * WebProcess/cocoa/RemoteRealtimeVideoSource.cpp:
+
 2022-03-10  Carlos Garcia Campos  <[email protected]>
 
         [GTK][WPE] Add initial support for PDF documents using PDF.js

Modified: trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h (291094 => 291095)


--- trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h	2022-03-10 09:08:01 UTC (rev 291095)
@@ -44,10 +44,6 @@
 class Semaphore;
 }
 
-namespace WebCore {
-class RemoteVideoSample;
-}
-
 namespace webrtc {
 using LocalDecoder = void*;
 using LocalEncoder = void*;

Modified: trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm (291094 => 291095)


--- trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm	2022-03-10 09:08:01 UTC (rev 291095)
@@ -40,7 +40,6 @@
 #import <WebCore/CVUtilities.h>
 #import <WebCore/LibWebRTCProvider.h>
 #import <WebCore/MediaSampleAVFObjC.h>
-#import <WebCore/RemoteVideoSample.h>
 #import <webrtc/sdk/WebKit/WebKitDecoder.h>
 #import <webrtc/sdk/WebKit/WebKitEncoder.h>
 #import <wtf/BlockPtr.h>
@@ -105,13 +104,10 @@
             sample->setOwnershipIdentity(resourceOwner);
         if (videoFrameObjectHeap) {
             auto properties = videoFrameObjectHeap->add(sample.releaseNonNull());
-            connection->send(Messages::LibWebRTCCodecs::CompletedDecoding { identifier, timeStamp, WTFMove(properties) }, 0);
+            connection->send(Messages::LibWebRTCCodecs::CompletedDecoding { identifier, timeStamp, timeStampNs, WTFMove(properties) }, 0);
             return;
         }
-        auto remoteSample = WebCore::RemoteVideoSample::create(*sample);
-        if (!remoteSample)
-            return;
-        connection->send(Messages::LibWebRTCCodecs::CompletedDecodingCV { identifier, timeStamp, *remoteSample }, 0);
+        connection->send(Messages::LibWebRTCCodecs::CompletedDecodingCV { identifier, timeStamp, timeStampNs, pixelBuffer }, 0);
     };
 }
 

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (291094 => 291095)


--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2022-03-10 09:08:01 UTC (rev 291095)
@@ -44,7 +44,6 @@
 #include <WebCore/MediaSampleAVFObjC.h>
 #include <WebCore/RealtimeMediaSourceCenter.h>
 #include <WebCore/RealtimeVideoSource.h>
-#include <WebCore/RemoteVideoSample.h>
 #include <WebCore/WebAudioBufferList.h>
 #include <wtf/UniqueRef.h>
 
@@ -191,22 +190,19 @@
         return &sample;
     }
 
-    void videoSampleAvailable(MediaSample& sample, VideoSampleMetadata metadata) final
+    void videoSampleAvailable(MediaSample& frame, VideoSampleMetadata metadata) final
     {
-        auto videoSample = rotateVideoFrameIfNeeded(sample);
-        if (!videoSample)
+        auto videoFrame = rotateVideoFrameIfNeeded(frame);
+        if (!videoFrame)
             return;
         if (m_resourceOwner)
-            videoSample->setOwnershipIdentity(m_resourceOwner);
-        if (m_videoFrameObjectHeap) {
-            auto properties = m_videoFrameObjectHeap->add(sample);
-            m_connection->send(Messages::RemoteCaptureSampleManager::VideoSampleAvailable(m_id, properties, metadata), 0);
+            videoFrame->setOwnershipIdentity(m_resourceOwner);
+        if (!m_videoFrameObjectHeap) {
+            m_connection->send(Messages::RemoteCaptureSampleManager::VideoFrameAvailableCV(m_id, videoFrame->pixelBuffer(), videoFrame->videoRotation(), videoFrame->videoMirrored(), videoFrame->presentationTime(), metadata), 0);
             return;
         }
-        auto remoteSample = RemoteVideoSample::create(*videoSample);
-        if (!remoteSample)
-            return;
-        m_connection->send(Messages::RemoteCaptureSampleManager::VideoSampleAvailableCV(m_id, *remoteSample, metadata), 0);
+        auto properties = m_videoFrameObjectHeap->add(*videoFrame);
+        m_connection->send(Messages::RemoteCaptureSampleManager::VideoFrameAvailable(m_id, properties, metadata), 0);
     }
 
     RetainPtr<CVPixelBufferRef> rotatePixelBuffer(MediaSample& sample)

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp (291094 => 291095)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp	2022-03-10 09:08:01 UTC (rev 291095)
@@ -39,7 +39,6 @@
 #include <WebCore/CVUtilities.h>
 #include <WebCore/LibWebRTCMacros.h>
 #include <WebCore/PlatformMediaSessionManager.h>
-#include <WebCore/RemoteVideoSample.h>
 #include <WebCore/RuntimeEnabledFeatures.h>
 #include <WebCore/VP9UtilitiesCocoa.h>
 #include <webrtc/sdk/WebKit/WebKitDecoder.h>
@@ -332,7 +331,7 @@
         decoder->hasError = true;
 }
 
-void LibWebRTCCodecs::completedDecoding(RTCDecoderIdentifier decoderIdentifier, uint32_t timeStamp, RemoteVideoFrameProxy::Properties&& properties)
+void LibWebRTCCodecs::completedDecoding(RTCDecoderIdentifier decoderIdentifier, uint32_t timeStamp, uint32_t timeStampNs, RemoteVideoFrameProxy::Properties&& properties)
 {
     assertIsCurrent(workQueue());
 
@@ -354,13 +353,13 @@
     if (!decoder->decodedImageCallback)
         return;
     auto& frame = remoteVideoFrame.leakRef(); // Balanced by the release callback of videoDecoderTaskComplete.
-    webrtc::videoDecoderTaskComplete(decoder->decodedImageCallback, timeStamp, frame.presentationTime().toDouble(), &frame,
+    webrtc::videoDecoderTaskComplete(decoder->decodedImageCallback, timeStamp, timeStampNs / 1000, &frame,
         [](auto* pointer) { return static_cast<RemoteVideoFrameProxy*>(pointer)->pixelBuffer(); },
         [](auto* pointer) { static_cast<RemoteVideoFrameProxy*>(pointer)->deref(); },
         frame.size().width(), frame.size().height());
 }
 
-void LibWebRTCCodecs::completedDecodingCV(RTCDecoderIdentifier decoderIdentifier, uint32_t timeStamp, WebCore::RemoteVideoSample&& remoteSample)
+void LibWebRTCCodecs::completedDecodingCV(RTCDecoderIdentifier decoderIdentifier, uint32_t timeStamp, uint32_t timeStampNs, RetainPtr<CVPixelBufferRef>&& pixelBuffer)
 {
     assertIsCurrent(workQueue());
 
@@ -373,14 +372,12 @@
     Locker locker { AdoptLock, decoder->decodedImageCallbackLock };
     if (!decoder->decodedImageCallback)
         return;
-    if (!remoteSample.surface())
-        return;
-    auto pixelBuffer = createCVPixelBuffer(remoteSample.surface()).value_or(nullptr);
+
     if (!pixelBuffer) {
         ASSERT_NOT_REACHED();
         return;
     }
-    webrtc::videoDecoderTaskComplete(decoder->decodedImageCallback, timeStamp, remoteSample.time().toDouble(), pixelBuffer.get());
+    webrtc::videoDecoderTaskComplete(decoder->decodedImageCallback, timeStamp, timeStampNs / 1000, pixelBuffer.get());
 }
 
 static inline String formatNameFromCodecType(LibWebRTCCodecs::Type type)

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h (291094 => 291095)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h	2022-03-10 09:08:01 UTC (rev 291095)
@@ -51,10 +51,6 @@
 class Decoder;
 }
 
-namespace WebCore {
-class RemoteVideoSample;
-}
-
 namespace webrtc {
 class VideoFrame;
 struct WebKitEncodedFrameInfo;
@@ -133,9 +129,9 @@
     void gpuProcessConnectionMayNoLongerBeNeeded();
 
     void failedDecoding(RTCDecoderIdentifier);
-    void completedDecoding(RTCDecoderIdentifier, uint32_t timeStamp, RemoteVideoFrameProxy::Properties&&);
+    void completedDecoding(RTCDecoderIdentifier, uint32_t timeStamp, uint32_t timeStampNs, RemoteVideoFrameProxy::Properties&&);
     // FIXME: Will be removed once RemoteVideoFrameProxy providers are the only ones sending data.
-    void completedDecodingCV(RTCDecoderIdentifier, uint32_t timeStamp, WebCore::RemoteVideoSample&&);
+    void completedDecodingCV(RTCDecoderIdentifier, uint32_t timeStamp, uint32_t timeStampNs, RetainPtr<CVPixelBufferRef>&&);
     void completedEncoding(RTCEncoderIdentifier, IPC::DataReference&&, const webrtc::WebKitEncodedFrameInfo&);
     RetainPtr<CVPixelBufferRef> convertToBGRA(CVPixelBufferRef);
 

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.messages.in (291094 => 291095)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.messages.in	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.messages.in	2022-03-10 09:08:01 UTC (rev 291095)
@@ -24,8 +24,8 @@
 
 messages -> LibWebRTCCodecs NotRefCounted {
     FailedDecoding(WebKit::RTCDecoderIdentifier identifier)
-    CompletedDecoding(WebKit::RTCDecoderIdentifier identifier, uint32_t timeStamp, WebKit::RemoteVideoFrameProxy::Properties frame)
-    CompletedDecodingCV(WebKit::RTCDecoderIdentifier identifier, uint32_t timeStamp, WebCore::RemoteVideoSample sample)
+    CompletedDecoding(WebKit::RTCDecoderIdentifier identifier, uint32_t timeStamp, uint32_t timeStampNs, WebKit::RemoteVideoFrameProxy::Properties frame)
+    CompletedDecodingCV(WebKit::RTCDecoderIdentifier identifier, uint32_t timeStamp, uint32_t timeStampNs, RetainPtr<CVPixelBufferRef> pixelBuffer)
     CompletedEncoding(WebKit::RTCEncoderIdentifier identifier, IPC::DataReference data, struct webrtc::WebKitEncodedFrameInfo info);
 }
 

Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp (291094 => 291095)


--- trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp	2022-03-10 09:08:01 UTC (rev 291095)
@@ -33,8 +33,7 @@
 #include "SharedRingBufferStorage.h"
 #include "WebProcess.h"
 #include <WebCore/CVUtilities.h>
-#include <WebCore/MediaSampleAVFObjC.h>
-#include <WebCore/RemoteVideoSample.h>
+#include <WebCore/VideoFrameCV.h>
 #include <WebCore/WebAudioBufferList.h>
 
 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
@@ -159,7 +158,7 @@
     iterator->value->setStorage(ipcHandle.handle, description, numberOfFrames, WTFMove(semaphore), mediaTime, frameChunkSize);
 }
 
-void RemoteCaptureSampleManager::videoSampleAvailable(RealtimeMediaSourceIdentifier identifier, RemoteVideoFrameProxy::Properties&& properties, VideoSampleMetadata metadata)
+void RemoteCaptureSampleManager::videoFrameAvailable(RealtimeMediaSourceIdentifier identifier, RemoteVideoFrameProxy::Properties&& properties, VideoSampleMetadata metadata)
 {
     ASSERT(!WTF::isMainRunLoop());
     // Create videoFrame before early outs so that the reference in `properties` is adopted.
@@ -177,7 +176,7 @@
     iterator->value->videoFrameAvailable(WTFMove(videoFrame), videoFrameSize, metadata);
 }
 
-void RemoteCaptureSampleManager::videoSampleAvailableCV(RealtimeMediaSourceIdentifier identifier, RemoteVideoSample&& sample, VideoSampleMetadata metadata)
+void RemoteCaptureSampleManager::videoFrameAvailableCV(RealtimeMediaSourceIdentifier identifier, RetainPtr<CVPixelBufferRef>&& pixelBuffer, WebCore::MediaSample::VideoRotation rotation, bool mirrored, MediaTime presentationTime, WebCore::VideoSampleMetadata metadata)
 {
     ASSERT(!WTF::isMainRunLoop());
     auto iterator = m_videoSources.find(identifier);
@@ -185,7 +184,10 @@
         RELEASE_LOG_ERROR(WebRTC, "Unable to find source %llu for remoteVideoSampleAvailable", identifier.toUInt64());
         return;
     }
-    iterator->value->videoSampleAvailable(WTFMove(sample), metadata);
+
+    auto videoFrame = VideoFrameCV::create(presentationTime, mirrored, rotation, WTFMove(pixelBuffer));
+    auto size = videoFrame->presentationSize();
+    iterator->value->videoFrameAvailable(videoFrame.get(), { static_cast<int>(size.width()), static_cast<int>(size.height()) }, metadata);
 }
 
 RemoteCaptureSampleManager::RemoteAudio::RemoteAudio(Ref<RemoteRealtimeAudioSource>&& source)
@@ -258,23 +260,6 @@
 {
 }
 
-void RemoteCaptureSampleManager::RemoteVideo::videoSampleAvailable(RemoteVideoSample&& remoteSample, VideoSampleMetadata metadata)
-{
-    auto pixelBuffer = createCVPixelBuffer(remoteSample.surface()).value_or(nullptr);
-    if (!pixelBuffer) {
-        ASSERT_NOT_REACHED();
-        return;
-    }
-
-    auto videoFrame = MediaSampleAVFObjC::createFromPixelBuffer(WTFMove(pixelBuffer), remoteSample.rotation(), remoteSample.mirrored(), remoteSample.time());
-    if (!videoFrame) {
-        ASSERT_NOT_REACHED();
-        return;
-    }
-
-    videoFrameAvailable(videoFrame.releaseNonNull(), remoteSample.size(), metadata);
-}
-
 void RemoteCaptureSampleManager::RemoteVideo::videoFrameAvailable(Ref<MediaSample>&& sample, IntSize size, VideoSampleMetadata metadata)
 {
     switchOn(m_source, [&](Ref<RemoteRealtimeVideoSource>& source) {

Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h (291094 => 291095)


--- trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h	2022-03-10 09:08:01 UTC (rev 291095)
@@ -45,7 +45,6 @@
 
 namespace WebCore {
 class ImageTransferSessionVT;
-class RemoteVideoSample;
 }
 
 namespace WebKit {
@@ -75,9 +74,9 @@
     // Messages
     void audioStorageChanged(WebCore::RealtimeMediaSourceIdentifier, const SharedMemory::IPCHandle&, const WebCore::CAAudioStreamDescription&, uint64_t numberOfFrames, IPC::Semaphore&&, const MediaTime&, size_t frameSampleSize);
     void audioSamplesAvailable(WebCore::RealtimeMediaSourceIdentifier, MediaTime, uint64_t numberOfFrames);
-    void videoSampleAvailable(WebCore::RealtimeMediaSourceIdentifier, RemoteVideoFrameProxy::Properties&&, WebCore::VideoSampleMetadata);
+    void videoFrameAvailable(WebCore::RealtimeMediaSourceIdentifier, RemoteVideoFrameProxy::Properties&&, WebCore::VideoSampleMetadata);
     // FIXME: Will be removed once RemoteVideoFrameProxy providers are the only ones sending data.
-    void videoSampleAvailableCV(WebCore::RealtimeMediaSourceIdentifier, WebCore::RemoteVideoSample&&, WebCore::VideoSampleMetadata);
+    void videoFrameAvailableCV(WebCore::RealtimeMediaSourceIdentifier, RetainPtr<CVPixelBufferRef>&&, WebCore::MediaSample::VideoRotation, bool mirrored, MediaTime, WebCore::VideoSampleMetadata);
 
     void setConnection(IPC::Connection*);
 
@@ -112,7 +111,6 @@
         using Source = std::variant<Ref<RemoteRealtimeVideoSource>, Ref<RemoteRealtimeDisplaySource>>;
         explicit RemoteVideo(Source&&);
 
-        void videoSampleAvailable(WebCore::RemoteVideoSample&&, WebCore::VideoSampleMetadata);
         void videoFrameAvailable(Ref<WebCore::MediaSample>&&, WebCore::IntSize, WebCore::VideoSampleMetadata);
 
     private:

Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.messages.in (291094 => 291095)


--- trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.messages.in	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.messages.in	2022-03-10 09:08:01 UTC (rev 291095)
@@ -25,8 +25,8 @@
 
 messages -> RemoteCaptureSampleManager NotRefCounted {
     AudioStorageChanged(WebCore::RealtimeMediaSourceIdentifier id, WebKit::SharedMemory::IPCHandle storageHandle, WebCore::CAAudioStreamDescription description, uint64_t numberOfFrames, IPC::Semaphore captureSemaphore, MediaTime mediaTime, size_t frameChunkSize);
-    VideoSampleAvailable(WebCore::RealtimeMediaSourceIdentifier id, WebKit::RemoteVideoFrameProxy::Properties sample, struct WebCore::VideoSampleMetadata metadata)
-    VideoSampleAvailableCV(WebCore::RealtimeMediaSourceIdentifier id, WebCore::RemoteVideoSample sample, struct WebCore::VideoSampleMetadata metadata)
+    VideoFrameAvailable(WebCore::RealtimeMediaSourceIdentifier id, WebKit::RemoteVideoFrameProxy::Properties sample, struct WebCore::VideoSampleMetadata metadata)
+    VideoFrameAvailableCV(WebCore::RealtimeMediaSourceIdentifier id, RetainPtr<CVPixelBufferRef> pixelBuffer, WebCore::MediaSample::VideoRotation rotation, bool mirrored, MediaTime presentationTime, struct WebCore::VideoSampleMetadata metadata)
 
 }
 

Modified: trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.cpp (291094 => 291095)


--- trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.cpp	2022-03-10 09:00:23 UTC (rev 291094)
+++ trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.cpp	2022-03-10 09:08:01 UTC (rev 291095)
@@ -38,7 +38,6 @@
 #include <WebCore/MediaConstraints.h>
 #include <WebCore/RealtimeMediaSource.h>
 #include <WebCore/RealtimeMediaSourceCenter.h>
-#include <WebCore/RemoteVideoSample.h>
 #include <WebCore/WebAudioBufferList.h>
 
 namespace WebKit {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to