⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 283610 in webkit


Ignore:
Timestamp:
Oct 6, 2021, 3:13:15 AM (5 years ago)
Author:
youenn@apple.com
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:
Location:
trunk/Source/ThirdParty/libwebrtc
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/ThirdParty/libwebrtc/ChangeLog

    r283431 r283610  
     12021-10-06  Youenn Fablet  <youenn@apple.com>
     2
     3        ObjectiveC WebRTC frame buffers are autoreleased late, especially on Debug builds
     4        https://bugs.webkit.org/show_bug.cgi?id=231162
     5
     6        Reviewed by David Kilzer.
     7
     8        Instead of waiting for the autorelease pool to release these objects, we explicitly release them by calling close.
     9        This ensures that pixel buffers get released very quickly.
     10
     11        * Source/webrtc/sdk/WebKit/WebKitEncoder.mm:
     12        * Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer+Private.h:
     13        * Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.mm:
     14        * Source/webrtc/sdk/objc/base/RTCI420Buffer.h:
     15        * Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h:
     16        * Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.h:
     17        * Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.mm:
     18        * Source/webrtc/sdk/objc/native/src/objc_frame_buffer.mm:
     19
    1202021-10-01  Chris Dumez  <cdumez@apple.com>
    221
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.mm

    r278701 r283610  
    371371        [rtcFrameTypes addObject:@(RTCFrameType(RTCFrameTypeVideoFrameKey))];
    372372
    373     auto *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:ToObjCVideoFrameBuffer(pixelBufferToFrame(pixelBuffer)) rotation:RTCVideoRotation(rotation) timeStampNs:timeStampNs];
     373    auto videoFrameBuffer = pixelBufferToFrame(pixelBuffer);
     374    auto *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:ToObjCVideoFrameBuffer(videoFrameBuffer) rotation:RTCVideoRotation(rotation) timeStampNs:timeStampNs];
    374375    videoFrame.timeStamp = timeStamp;
    375376    auto *encoder = (__bridge WK_RTCLocalVideoH264H265Encoder *)(localEncoder);
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer+Private.h

    r237075 r283610  
    2424- (rtc::scoped_refptr<webrtc::I420BufferInterface>)nativeI420Buffer;
    2525
     26#if defined(WEBRTC_WEBKIT_BUILD)
     27- (void)close;
     28#endif
    2629@end
    2730
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/api/video_frame_buffer/RTCNativeI420Buffer.mm

    r264517 r283610  
    110110}
    111111
     112#if defined(WEBRTC_WEBKIT_BUILD)
     113- (void)close {
     114  _i420Buffer = nullptr;
     115}
     116#endif
     117
    112118#pragma mark - Debugging
    113119
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/base/RTCVideoFrameBuffer.h

    r252472 r283610  
    2626- (id<RTCI420Buffer>)toI420;
    2727
     28#if defined(WEBRTC_WEBKIT_BUILD)
     29- (void)close;
     30#endif
    2831@end
    2932
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.h

    r248077 r283610  
    4949        withTempBuffer:(nullable uint8_t *)tmpBuffer;
    5050
     51#if defined(WEBRTC_WEBKIT_BUILD)
     52- (void)close;
     53#endif
    5154@end
    5255
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_frame_buffer/RTCCVPixelBuffer.mm

    r237075 r283610  
    346346}
    347347
     348#if defined(WEBRTC_WEBKIT_BUILD)
     349- (void)close {
     350    CVBufferRelease(_pixelBuffer);
     351    _pixelBuffer = nil;
     352}
     353#endif
     354
    348355@end
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/native/src/objc_frame_buffer.mm

    r252472 r283610  
    2323  explicit ObjCI420FrameBuffer(id<RTCI420Buffer> frame_buffer)
    2424      : frame_buffer_(frame_buffer), width_(frame_buffer.width), height_(frame_buffer.height) {}
    25   ~ObjCI420FrameBuffer() override {}
     25  ~ObjCI420FrameBuffer() override {
     26#if defined(WEBRTC_WEBKIT_BUILD)
     27    [frame_buffer_ close];
     28#endif
     29  }
    2630
    2731  int width() const override { return width_; }
    … …  
    5256    : frame_buffer_(frame_buffer), width_(frame_buffer.width), height_(frame_buffer.height) {}
    5357
    54 ObjCFrameBuffer::~ObjCFrameBuffer() {}
     58ObjCFrameBuffer::~ObjCFrameBuffer() {
     59#if defined(WEBRTC_WEBKIT_BUILD)
     60  [frame_buffer_ close];
     61#endif
     62}
    5563
    5664VideoFrameBuffer::Type ObjCFrameBuffer::type() const {
Note: See TracChangeset for help on using the changeset viewer.