Title: [283610] trunk/Source/ThirdParty/libwebrtc
Revision
283610
Author
[email protected]
Date
2021-10-06 03:13:15 -0700 (Wed, 06 Oct 2021)

Log Message

ObjectiveC WebRTC frame buffers are autoreleased late, especially on Debug builds
https://bugs.webkit.org/show_bug.cgi?id=231162

Reviewed by David Kilzer.

Instead of waiting for the autorelease pool to release these objects, we explicitly release them by calling close.
This ensures that pixel buffers get released very quickly.

* Source/webrtc/sdk/WebKit/WebKitEncoder.mm:
* Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer+Private.h:
* Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.mm:
* Source/webrtc/sdk/objc/base/RTCI420Buffer.h:
* Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h:
* Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.h:
* Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.mm:
* Source/webrtc/sdk/objc/native/src/objc_frame_buffer.mm:

Modified Paths

Diff

Modified: trunk/Source/ThirdParty/libwebrtc/ChangeLog (283609 => 283610)


--- trunk/Source/ThirdParty/libwebrtc/ChangeLog	2021-10-06 09:48:38 UTC (rev 283609)
+++ trunk/Source/ThirdParty/libwebrtc/ChangeLog	2021-10-06 10:13:15 UTC (rev 283610)
@@ -1,3 +1,22 @@
+2021-10-06  Youenn Fablet  <[email protected]>
+
+        ObjectiveC WebRTC frame buffers are autoreleased late, especially on Debug builds
+        https://bugs.webkit.org/show_bug.cgi?id=231162
+
+        Reviewed by David Kilzer.
+
+        Instead of waiting for the autorelease pool to release these objects, we explicitly release them by calling close.
+        This ensures that pixel buffers get released very quickly.
+
+        * Source/webrtc/sdk/WebKit/WebKitEncoder.mm:
+        * Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer+Private.h:
+        * Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.mm:
+        * Source/webrtc/sdk/objc/base/RTCI420Buffer.h:
+        * Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h:
+        * Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.h:
+        * Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.mm:
+        * Source/webrtc/sdk/objc/native/src/objc_frame_buffer.mm:
+
 2021-10-01  Chris Dumez  <[email protected]>
 
         Drop support for macOS < 10.15

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.mm (283609 => 283610)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.mm	2021-10-06 09:48:38 UTC (rev 283609)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.mm	2021-10-06 10:13:15 UTC (rev 283610)
@@ -370,7 +370,8 @@
     if (isKeyframeRequired)
         [rtcFrameTypes addObject:@(RTCFrameType(RTCFrameTypeVideoFrameKey))];
 
-    auto *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:ToObjCVideoFrameBuffer(pixelBufferToFrame(pixelBuffer)) rotation:RTCVideoRotation(rotation) timeStampNs:timeStampNs];
+    auto videoFrameBuffer = pixelBufferToFrame(pixelBuffer);
+    auto *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:ToObjCVideoFrameBuffer(videoFrameBuffer) rotation:RTCVideoRotation(rotation) timeStampNs:timeStampNs];
     videoFrame.timeStamp = timeStamp;
     auto *encoder = (__bridge WK_RTCLocalVideoH264H265Encoder *)(localEncoder);
     [encoder encode:videoFrame codecSpecificInfo:nil frameTypes:rtcFrameTypes];

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer+Private.h (283609 => 283610)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer+Private.h	2021-10-06 09:48:38 UTC (rev 283609)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer+Private.h	2021-10-06 10:13:15 UTC (rev 283610)
@@ -23,6 +23,9 @@
 - (instancetype)initWithFrameBuffer:(rtc::scoped_refptr<webrtc::I420BufferInterface>)i420Buffer;
 - (rtc::scoped_refptr<webrtc::I420BufferInterface>)nativeI420Buffer;
 
+#if defined(WEBRTC_WEBKIT_BUILD)
+- (void)close;
+#endif
 @end
 
 NS_ASSUME_NONNULL_END

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.mm (283609 => 283610)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.mm	2021-10-06 09:48:38 UTC (rev 283609)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.mm	2021-10-06 10:13:15 UTC (rev 283610)
@@ -109,6 +109,12 @@
   return _i420Buffer;
 }
 
+#if defined(WEBRTC_WEBKIT_BUILD)
+- (void)close {
+  _i420Buffer = nullptr;
+}
+#endif
+
 #pragma mark - Debugging
 
 #if !defined(NDEBUG) && defined(WEBRTC_IOS)

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h (283609 => 283610)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h	2021-10-06 09:48:38 UTC (rev 283609)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h	2021-10-06 10:13:15 UTC (rev 283610)
@@ -25,6 +25,9 @@
 
 - (id<RTCI420Buffer>)toI420;
 
+#if defined(WEBRTC_WEBKIT_BUILD)
+- (void)close;
+#endif
 @end
 
 NS_ASSUME_NONNULL_END

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.h (283609 => 283610)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.h	2021-10-06 09:48:38 UTC (rev 283609)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.h	2021-10-06 10:13:15 UTC (rev 283610)
@@ -48,6 +48,9 @@
 - (BOOL)cropAndScaleTo:(CVPixelBufferRef)outputPixelBuffer
         withTempBuffer:(nullable uint8_t *)tmpBuffer;
 
+#if defined(WEBRTC_WEBKIT_BUILD)
+- (void)close;
+#endif
 @end
 
 NS_ASSUME_NONNULL_END

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.mm (283609 => 283610)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.mm	2021-10-06 09:48:38 UTC (rev 283609)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.mm	2021-10-06 10:13:15 UTC (rev 283610)
@@ -345,4 +345,11 @@
   CVPixelBufferUnlockBaseAddress(outputPixelBuffer, 0);
 }
 
+#if defined(WEBRTC_WEBKIT_BUILD)
+- (void)close {
+    CVBufferRelease(_pixelBuffer);
+    _pixelBuffer = nil;
+}
+#endif
+
 @end

Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/native/src/objc_frame_buffer.mm (283609 => 283610)


--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/native/src/objc_frame_buffer.mm	2021-10-06 09:48:38 UTC (rev 283609)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/native/src/objc_frame_buffer.mm	2021-10-06 10:13:15 UTC (rev 283610)
@@ -22,7 +22,11 @@
  public:
   explicit ObjCI420FrameBuffer(id<RTCI420Buffer> frame_buffer)
       : frame_buffer_(frame_buffer), width_(frame_buffer.width), height_(frame_buffer.height) {}
-  ~ObjCI420FrameBuffer() override {}
+  ~ObjCI420FrameBuffer() override {
+#if defined(WEBRTC_WEBKIT_BUILD)
+    [frame_buffer_ close];
+#endif
+  }
 
   int width() const override { return width_; }
 
@@ -51,7 +55,11 @@
 ObjCFrameBuffer::ObjCFrameBuffer(id<RTCVideoFrameBuffer> frame_buffer)
     : frame_buffer_(frame_buffer), width_(frame_buffer.width), height_(frame_buffer.height) {}
 
-ObjCFrameBuffer::~ObjCFrameBuffer() {}
+ObjCFrameBuffer::~ObjCFrameBuffer() {
+#if defined(WEBRTC_WEBKIT_BUILD)
+  [frame_buffer_ close];
+#endif
+}
 
 VideoFrameBuffer::Type ObjCFrameBuffer::type() const {
   return Type::kNative;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to