Bug 206582

Summary: [Cocoa] Use AVAssetWriterDelegate to implement MediaRecorder
Product: WebKit Reporter: youenn fablet <youennf>
Component: WebRTCAssignee: youenn fablet <youennf>
Status: RESOLVED FIXED    
Severity: Normal CC: benjamin, cdumez, cmarcelo, commit-queue, dbates, eric.carlson, ews-watchlist, glenn, jer.noble, peng.liu6, philipj, sergio, webkit-bug-importer, youennf, zalan
Priority: P2 Keywords: InRadar
Version: WebKit Nightly Build   
Hardware: Unspecified   
OS: Unspecified   
Bug Depends on: 206933, 207270, 207345    
Bug Blocks:    
Attachments:
Description Flags
WIP
none
WIP
none
Rebasing
none
Patch
none
Patch
none
Patch for landing
none
Patch
none
Patch for landing
none
Patch for landing
none
Fix include path and commented out code
none
Patch
none
Patch
none
Patch
none
Patch
none
Patch
none
Patch
none
Patch
none
Patch
none
Patch
none
Build fix
none
A follow-up patch to fix a build failure
youennf: review+, ews-feeder: commit-queue-
One more reserveCapacity
none
Rebasing none

Description youenn fablet 2020-01-22 08:10:31 PST
[Cocoa] Use AVAssetWriterDelegate to implement MediaRecorder
Comment 1 youenn fablet 2020-01-22 08:34:03 PST
Created attachment 388423 [details]
WIP
Comment 2 youenn fablet 2020-01-22 09:15:41 PST
Created attachment 388428 [details]
WIP
Comment 3 Eric Carlson 2020-01-22 09:17:14 PST
Comment on attachment 388423 [details]
WIP

View in context: https://bugs.webkit.org/attachment.cgi?id=388423&action=review

At some point it would be nice to have VideoSampleBufferCompressor and AudioSampleBufferCompressor as C++ classes so they can be reused more easily.

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:90
> +    m_serialDispatchQueue = dispatch_queue_create([@"com.apple.WebAudioSampleBufferCompressor" UTF8String], DISPATCH_QUEUE_SERIAL);

Nit: no need to round trip through an NSString, a char* should work.

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:112
> +        auto error = CMBufferQueueMarkEndOfData(m_outputBufferQueue.get());

This should be added to CoreMediaSoftLink

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:127
> +    const auto *audioFormatListItem = CMAudioFormatDescriptionGetRichestDecodableFormat(formatDescription);

Ditto

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:134
> +    if (auto error = AudioFormatGetProperty(kAudioFormatProperty_FormatInfo, 0, NULL, &size, &m_destinationFormat)) {

This should be soft linked, maybe create a new AudioToolboxSoftLink file?

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:140
> +    if (auto error = AudioConverterNew(&m_sourceFormat, &m_destinationFormat, &converter)) {

Ditto

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:147
> +    const void *cookie = CMAudioFormatDescriptionGetMagicCookie(formatDescription, &cookieSize);

This should be added to CoreMediaSoftLink

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:149
> +        if (auto error = AudioConverterSetProperty(m_converter.get(), kAudioConverterDecompressionMagicCookie, (UInt32)cookieSize, cookie)) {

AudioToolboxSoftLink

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:156
> +    if (auto error = AudioConverterGetProperty(m_converter.get(), kAudioConverterCurrentInputStreamDescription, &size, &m_sourceFormat)) {

Ditto.

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:177
> +        UInt32 outputBitRate = 64000;
> +        if (m_destinationFormat.mSampleRate >= 44100)
> +            outputBitRate = 192000;
> +        else if (m_destinationFormat.mSampleRate < 22000)
> +            outputBitRate = 32000;

Named constants might help readers understand the values.

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:180
> +        if (auto error = AudioConverterSetProperty(m_converter.get(), kAudioConverterEncodeBitRate, size, &outputBitRate)) {

AudioToolboxSoftLink

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:197
> +    m_sourceBuffer.reserveCapacity([self computeBufferSizeForAudioFormat:m_sourceFormat maxOutputPacketSize:0 duration:0.1]);
> +    m_destinationBuffer.reserveCapacity([self computeBufferSizeForAudioFormat:m_destinationFormat maxOutputPacketSize:m_maxOutputPacketSize duration:0.1]);

Named constants would be good here too (is this LOW_WATER_TIME_IN_SECOND?)

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:386
> +        while (0 < numBytesToCopy) {

This would probably be better as "numBytesToCopy > 0"

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:459
> +        // We assume that the source format is PCM, which is not VBR, but CBR.
> +        // So, there is not packet descriptions describing the layout of each packet.

Should we ASSERT this assumption?

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:482
> +- (CMSampleBufferRef)pickOutputSampleBuffer

"getOutputSampleBuffer" would be a better match for the typical WebKit naming style.

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:55
> +    auto error = CMBufferQueueCreate(kCFAllocatorDefault, 0, CMBufferQueueGetCallbacksForUnsortedSampleBuffers(), &m_outputBufferQueue);

CoreMediaSoftLink

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:84
> +        auto error = VTCompressionSessionCompleteFrames(m_vtSession.get(), kCMTimeInvalid);

This should be soft linked, maybe add a VTCompressionSessionSoftLink?

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:87
> +        error = CMBufferQueueMarkEndOfData(m_outputBufferQueue);

CoreMediaSoftLink

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:112
> +    auto error = VTCompressionSessionCreate(kCFAllocatorDefault, dimensions.width, dimensions.height, m_outputCodecType, (__bridge CFDictionaryRef)encoderSpecifications, NULL, NULL, videoCompressionCallback, (__bridge void *)self, &vtSession);

VTCompressionSessionSoftLink

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:126
> +    error = VTSessionSetProperty(m_vtSession.get(), kVTCompressionPropertyKey_RealTime, kCFBooleanTrue);
> +    RELEASE_LOG_ERROR_IF(error, MediaStream, "WebVideoSampleBufferCompressor VTSessionSetProperty kVTCompressionPropertyKey_RealTime failed with %d", error);
> +    error = VTSessionSetProperty(m_vtSession.get(), kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration, (__bridge CFTypeRef)@(m_maxKeyFrameIntervalDuration));
> +    RELEASE_LOG_ERROR_IF(error, MediaStream, "WebVideoSampleBufferCompressor VTSessionSetProperty kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration failed with %d", error);
> +    error = VTSessionSetProperty(m_vtSession.get(), kVTCompressionPropertyKey_ExpectedFrameRate, (__bridge CFTypeRef)@(m_expectedFrameRate));
> +    RELEASE_LOG_ERROR_IF(error, MediaStream, "WebVideoSampleBufferCompressor VTSessionSetProperty kVTCompressionPropertyKey_ExpectedFrameRate failed with %d", error);
> +
> +    error = VTCompressionSessionPrepareToEncodeFrames(m_vtSession.get());

Ditto

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:142
> +    auto error = VTCompressionSessionEncodeFrame(m_vtSession.get(), imageBuffer, presentationTimeStamp, duration, NULL, (__bridge void *)self, NULL);

Ditto.
Comment 4 youenn fablet 2020-01-22 10:01:34 PST
Created attachment 388434 [details]
Rebasing
Comment 5 youenn fablet 2020-01-22 11:47:07 PST
Created attachment 388452 [details]
Patch
Comment 6 youenn fablet 2020-01-24 02:00:42 PST
Created attachment 388661 [details]
Patch
Comment 7 Eric Carlson 2020-01-24 10:24:30 PST
Comment on attachment 388661 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=388661&action=review

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:124
> +    const void *cookie = CMAudioFormatDescriptionGetMagicCookie(formatDescription, &cookieSize);

This should be added to CoreMediaSoftLink.

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:273
> +    if (auto error = CMBlockBufferReplaceDataBytes(data, buffer.get(), 0, dataSize)) {

Ditto

> Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm:281
> +    if (![m_videoAssetWriterInput isReadyForMoreMediaData])
> +        [m_writer flush];

Will the AssetWriter always be ready for more media data after flushing the writer?
Comment 8 youenn fablet 2020-01-27 05:03:03 PST
Created attachment 388847 [details]
Patch for landing
Comment 9 youenn fablet 2020-01-27 05:05:45 PST
(In reply to Eric Carlson from comment #7)
> Comment on attachment 388661 [details]
> Patch
> 
> View in context:
> https://bugs.webkit.org/attachment.cgi?id=388661&action=review
> 
> > Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:124
> > +    const void *cookie = CMAudioFormatDescriptionGetMagicCookie(formatDescription, &cookieSize);
> 
> This should be added to CoreMediaSoftLink.

Done

> > Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:273
> > +    if (auto error = CMBlockBufferReplaceDataBytes(data, buffer.get(), 0, dataSize)) {
> 
> Ditto

Done

> > Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm:281
> > +    if (![m_videoAssetWriterInput isReadyForMoreMediaData])
> > +        [m_writer flush];
> 
> Will the AssetWriter always be ready for more media data after flushing the
> writer?

This works as per my testing but I do not see any guarantee for that.
I guess the other approach is to use requestMediaDataWhenReadyOnQueue.
Comment 10 youenn fablet 2020-01-27 05:21:05 PST
> > Will the AssetWriter always be ready for more media data after flushing the
> > writer?
> 
> This works as per my testing but I do not see any guarantee for that.
> I guess the other approach is to use requestMediaDataWhenReadyOnQueue.

Actually, no this does not work, let's just stop pushing samples when not being ready for now.
Comment 11 youenn fablet 2020-01-27 09:18:58 PST
Created attachment 388867 [details]
Patch
Comment 12 youenn fablet 2020-01-27 11:11:50 PST
Created attachment 388875 [details]
Patch for landing
Comment 13 youenn fablet 2020-01-28 08:00:43 PST
Created attachment 388994 [details]
Patch for landing
Comment 14 WebKit Commit Bot 2020-01-29 02:02:44 PST
Comment on attachment 388994 [details]
Patch for landing

Clearing flags on attachment: 388994

Committed r255345: <https://trac.webkit.org/changeset/255345>
Comment 15 WebKit Commit Bot 2020-01-29 02:02:46 PST
All reviewed patches have been landed.  Closing bug.
Comment 16 Radar WebKit Bug Importer 2020-01-29 02:03:16 PST
<rdar://problem/58985368>
Comment 17 zalan 2020-01-29 07:52:45 PST
Any particular reason to land commented out code?
Comment 18 youenn fablet 2020-01-29 07:56:28 PST
(In reply to zalan from comment #17)
> Any particular reason to land commented out code?

Which code are you referring to?
Comment 19 zalan 2020-01-29 07:57:32 PST
(In reply to youenn fablet from comment #18)
> (In reply to zalan from comment #17)
> > Any particular reason to land commented out code?
> 
> Which code are you referring to?

/*
 auto block = makeBlockPtr([this, weakThis = makeWeakPtr(this), completionHandler = WTFMove(completionHandler)]() mutable {
         if (weakThis) {
             appendEndsPreviousSampleDurationMarker(m_videoAssetWriterInput.get(), m_lastVideoPresentationTime, m_lastVideoDecodingTime);
             [m_videoAssetWriterInput markAsFinished];
         }
         completionHandler();
     });
     [m_videoAssetWriterInput requestMediaDataWhenReadyOnQueue:dispatch_get_main_queue() usingBlock:block.get()];
*/
Comment 20 youenn fablet 2020-01-29 07:59:42 PST
Oh right, should fix that.
Comment 21 WebKit Commit Bot 2020-01-29 08:03:07 PST
Re-opened since this is blocked by bug 206933
Comment 22 youenn fablet 2020-01-30 05:20:41 PST
Created attachment 389240 [details]
Fix include path and commented out code
Comment 23 WebKit Commit Bot 2020-01-30 06:18:41 PST
The commit-queue encountered the following flaky tests while processing attachment 389240 [details]:

editing/spelling/spellcheck-attribute.html bug 206178 (authors: g.czajkowski@samsung.com, mark.lam@apple.com, and rniwa@webkit.org)
The commit-queue is continuing to process your patch.
Comment 24 WebKit Commit Bot 2020-01-30 06:19:13 PST
The commit-queue encountered the following flaky tests while processing attachment 389240 [details]:

editing/spelling/spellcheck-async-remove-frame.html bug 158401 (authors: morrita@google.com, rniwa@webkit.org, and tony@chromium.org)
imported/w3c/web-platform-tests/IndexedDB/fire-success-event-exception.html bug 206554 (authors: shvaikalesh@gmail.com and youennf@gmail.com)
The commit-queue is continuing to process your patch.
Comment 25 WebKit Commit Bot 2020-01-30 06:51:53 PST
The commit-queue encountered the following flaky tests while processing attachment 389240 [details]:

editing/spelling/spellcheck-attribute.html bug 206178 (authors: g.czajkowski@samsung.com, mark.lam@apple.com, and rniwa@webkit.org)
The commit-queue is continuing to process your patch.
Comment 26 WebKit Commit Bot 2020-01-30 06:52:35 PST
Comment on attachment 389240 [details]
Fix include path and commented out code

Clearing flags on attachment: 389240

Committed r255424: <https://trac.webkit.org/changeset/255424>
Comment 27 WebKit Commit Bot 2020-01-30 06:52:37 PST
All reviewed patches have been landed.  Closing bug.
Comment 28 Ryan Haddad 2020-01-30 10:57:51 PST
Reverted r255424 for reason:

Breaks internal builds.

Committed r255439: <https://trac.webkit.org/changeset/255439>
Comment 29 youenn fablet 2020-02-03 05:32:39 PST
Created attachment 389501 [details]
Patch
Comment 30 youenn fablet 2020-02-03 09:38:51 PST
Created attachment 389528 [details]
Patch
Comment 31 youenn fablet 2020-02-04 01:39:07 PST
Created attachment 389637 [details]
Patch
Comment 32 youenn fablet 2020-02-04 01:54:26 PST
Created attachment 389642 [details]
Patch
Comment 33 youenn fablet 2020-02-04 05:18:01 PST
Created attachment 389652 [details]
Patch
Comment 34 Eric Carlson 2020-02-04 06:14:28 PST
Comment on attachment 389652 [details]
Patch

View in context: https://bugs.webkit.org/attachment.cgi?id=389652&action=review

> Source/WebCore/ChangeLog:20
> +        Note that, whenever we request data, we flush the writer and insert an end of video sample to amke sure video data gets flushed.

s/amke/make/

> Source/WebCore/ChangeLog:21
> +        Therefore data should not be requested to fast to get adequate video compression.

s/to fast/too fast/

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:38
> +#define LOW_WATER_TIME_IN_SECOND 0.1

s/LOW_WATER_TIME_IN_SECOND/LOW_WATER_TIME_IN_SECONDS/

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:68
> +    if (auto error = CMBufferQueueCreate(kCFAllocatorDefault, 0, CMBufferQueueGetCallbacksForUnsortedSampleBuffers(), &inputBufferQueue)) {

CMBufferQueueGetCallbacksForUnsortedSampleBuffers should be soft linked.

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:75
> +    if (auto error = CMBufferQueueCreate(kCFAllocatorDefault, 0, CMBufferQueueGetCallbacksForUnsortedSampleBuffers(), &outputBufferQueue)) {

Ditto

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:204
> +        CMSetAttachment(buffer, kCMSampleBufferAttachmentKey_TrimDurationAtStart, trimAtStartDict, kCMAttachmentMode_ShouldPropagate);

This constant should be soft linked

> Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:287
> +        CMSetAttachment(sampleBuffer, kCMSampleBufferAttachmentKey_GradualDecoderRefresh, (__bridge CFTypeRef)m_gdrCountNum.get(), kCMAttachmentMode_ShouldPropagate);

Ditto.

> Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm:300
> +    CMSetAttachment(sampleBuffer.get(), kCMSampleBufferAttachmentKey_EndsPreviousSampleDuration, kCFBooleanTrue, kCMAttachmentMode_ShouldPropagate);

Soft link

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:65
> +    if (auto error = CMBufferQueueCreate(kCFAllocatorDefault, 0, CMBufferQueueGetCallbacksForUnsortedSampleBuffers(), &outputBufferQueue)) {

Soft link

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:107
> +    NSDictionary *encoderSpecifications = @{(__bridge NSString *)kVTVideoEncoderSpecification_EnableHardwareAcceleratedVideoEncoder:@YES};

Ditto.

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:118
> +    error = VTSessionSetProperty(m_vtSession.get(), kVTCompressionPropertyKey_RealTime, kCFBooleanTrue);

Ditto.

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:120
> +    error = VTSessionSetProperty(m_vtSession.get(), kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration, (__bridge CFTypeRef)@(m_maxKeyFrameIntervalDuration));

Ditto.

> Source/WebCore/platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm:122
> +    error = VTSessionSetProperty(m_vtSession.get(), kVTCompressionPropertyKey_ExpectedFrameRate, (__bridge CFTypeRef)@(m_expectedFrameRate));

Ditto.
Comment 35 youenn fablet 2020-02-05 06:47:58 PST
Created attachment 389803 [details]
Patch
Comment 36 WebKit Commit Bot 2020-02-05 08:53:59 PST
Comment on attachment 389803 [details]
Patch

Clearing flags on attachment: 389803

Committed r255818: <https://trac.webkit.org/changeset/255818>
Comment 37 WebKit Commit Bot 2020-02-05 08:54:02 PST
All reviewed patches have been landed.  Closing bug.
Comment 38 WebKit Commit Bot 2020-02-05 09:12:07 PST
Re-opened since this is blocked by bug 207270
Comment 39 youenn fablet 2020-02-05 23:21:23 PST
Created attachment 389938 [details]
Patch
Comment 40 WebKit Commit Bot 2020-02-06 00:34:57 PST
Comment on attachment 389938 [details]
Patch

Clearing flags on attachment: 389938

Committed r255910: <https://trac.webkit.org/changeset/255910>
Comment 41 WebKit Commit Bot 2020-02-06 00:35:00 PST
All reviewed patches have been landed.  Closing bug.
Comment 42 Ryan Haddad 2020-02-06 11:53:51 PST
Attempt to fix internal builds: https://trac.webkit.org/changeset/255970/webkit
Comment 43 WebKit Commit Bot 2020-02-06 11:59:45 PST
Re-opened since this is blocked by bug 207345
Comment 44 youenn fablet 2020-02-06 23:14:23 PST
Created attachment 390057 [details]
Patch
Comment 45 WebKit Commit Bot 2020-02-07 00:48:02 PST
The commit-queue encountered the following flaky tests while processing attachment 390057 [details]:

editing/spelling/spellcheck-attribute.html bug 206178 (authors: g.czajkowski@samsung.com, mark.lam@apple.com, and rniwa@webkit.org)
imported/w3c/web-platform-tests/web-animations/timing-model/timelines/update-and-send-events-replacement.html bug 207335 (author: graouts@apple.com)
The commit-queue is continuing to process your patch.
Comment 46 WebKit Commit Bot 2020-02-07 00:48:58 PST
Comment on attachment 390057 [details]
Patch

Clearing flags on attachment: 390057

Committed r256010: <https://trac.webkit.org/changeset/256010>
Comment 47 WebKit Commit Bot 2020-02-07 00:49:00 PST
All reviewed patches have been landed.  Closing bug.
Comment 48 Ryan Haddad 2020-02-12 17:07:05 PST
Rolled out in https://trac.webkit.org/changeset/256493/webkit due to crashes. Details are in radar.
Comment 49 youenn fablet 2020-06-04 06:21:44 PDT
Crashes were probably due to use of reserveCapacity since it is calling asanSetInitialBufferSizeTo. Instead we could use resize.
Comment 50 youenn fablet 2020-06-05 05:19:10 PDT
Created attachment 401142 [details]
Patch
Comment 51 EWS 2020-06-05 08:18:19 PDT
Committed r262619: <https://trac.webkit.org/changeset/262619>

All reviewed patches have been landed. Closing bug and clearing flags on attachment 401142 [details].
Comment 52 youenn fablet 2020-06-05 09:14:05 PDT
Reopening to attach new patch.
Comment 53 youenn fablet 2020-06-05 09:14:09 PDT
Created attachment 401159 [details]
Build fix
Comment 54 EWS 2020-06-05 09:47:35 PDT
Committed r262625: <https://trac.webkit.org/changeset/262625>

All reviewed patches have been landed. Closing bug and clearing flags on attachment 401159 [details].
Comment 55 Peng Liu 2020-06-05 11:50:26 PDT
Reopening to attach new patch.
Comment 56 Peng Liu 2020-06-05 11:50:27 PDT
Created attachment 401178 [details]
A follow-up patch to fix a build failure
Comment 57 EWS 2020-06-05 12:35:30 PDT
Tools/Scripts/svn-apply failed to apply attachment 401178 [details] to trunk.
Please resolve the conflicts and upload a new patch.
Comment 58 Peng Liu 2020-06-05 13:44:18 PDT
It was fixed in r262641. <https://trac.webkit.org/changeset/262641>
Comment 59 Ryan Haddad 2020-06-05 15:49:20 PDT
Reverted r262619, r262625, and r262641 for reason:

Caused mediarecorder layout test crashes.

Committed r262663: <https://trac.webkit.org/changeset/262663>
Comment 60 Ryan Haddad 2020-06-05 15:49:21 PDT
Reverted r262619, r262625, and r262641 for reason:

Caused mediarecorder layout test crashes.

Committed r262663: <https://trac.webkit.org/changeset/262663>
Comment 61 youenn fablet 2020-06-07 23:22:04 PDT
Created attachment 401312 [details]
One more reserveCapacity
Comment 62 youenn fablet 2020-06-08 02:41:32 PDT
Created attachment 401321 [details]
Rebasing
Comment 63 EWS 2020-06-08 04:49:20 PDT
Committed r262708: <https://trac.webkit.org/changeset/262708>

All reviewed patches have been landed. Closing bug and clearing flags on attachment 401321 [details].