Bug 206582 - [Cocoa] Use AVAssetWriterDelegate to implement MediaRecorder
Summary: [Cocoa] Use AVAssetWriterDelegate to implement MediaRecorder
Status: REOPENED
Alias: None
Product: WebKit
Classification: Unclassified
Component: WebRTC (show other bugs)
Version: WebKit Nightly Build
Hardware: Unspecified Unspecified
: P2 Normal
Assignee: youenn fablet
URL:
Keywords: InRadar
Depends on: 206933 207270 207345
Blocks:
  Show dependency treegraph
 
Reported: 2020-01-22 08:10 PST by youenn fablet
Modified: 2020-02-12 17:07 PST (History)
14 users (show)

See Also:


Attachments
WIP (80.21 KB, patch)
2020-01-22 08:34 PST, youenn fablet
no flags Details | Formatted Diff | Diff
WIP (97.22 KB, patch)
2020-01-22 09:15 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Rebasing (96.24 KB, patch)
2020-01-22 10:01 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (95.31 KB, patch)
2020-01-22 11:47 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (122.64 KB, patch)
2020-01-24 02:00 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch for landing (129.08 KB, patch)
2020-01-27 05:03 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (136.97 KB, patch)
2020-01-27 09:18 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch for landing (135.78 KB, patch)
2020-01-27 11:11 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch for landing (134.16 KB, patch)
2020-01-28 08:00 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Fix include path and commented out code (134.02 KB, patch)
2020-01-30 05:20 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (135.04 KB, patch)
2020-02-03 05:32 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (148.68 KB, patch)
2020-02-03 09:38 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (146.92 KB, patch)
2020-02-04 01:39 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (146.98 KB, patch)
2020-02-04 01:54 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (137.71 KB, patch)
2020-02-04 05:18 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (142.07 KB, patch)
2020-02-05 06:47 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (142.06 KB, patch)
2020-02-05 23:21 PST, youenn fablet
no flags Details | Formatted Diff | Diff
Patch (142.04 KB, patch)
2020-02-06 23:14 PST, youenn fablet
no flags Details | Formatted Diff | Diff

Note You need to log in before you can comment on or make changes to this bug.
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.