Title: [262316] trunk/Source/WebCore
Revision
262316
Author
jacob_uph...@apple.com
Date
2020-05-29 14:06:04 -0700 (Fri, 29 May 2020)

Log Message

Unreviewed, reverting r262289.

This commit caused a test to crash internally

Reverted changeset:

"MediaPlayerPrivateMediaStreamAVFObjC should enqueue samples
in a background thread"
https://bugs.webkit.org/show_bug.cgi?id=212073
https://trac.webkit.org/changeset/262289

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (262315 => 262316)


--- trunk/Source/WebCore/ChangeLog	2020-05-29 20:28:30 UTC (rev 262315)
+++ trunk/Source/WebCore/ChangeLog	2020-05-29 21:06:04 UTC (rev 262316)
@@ -1,3 +1,16 @@
+2020-05-29  Jacob Uphoff  <jacob_uph...@apple.com>
+
+        Unreviewed, reverting r262289.
+
+        This commit caused a test to crash internally
+
+        Reverted changeset:
+
+        "MediaPlayerPrivateMediaStreamAVFObjC should enqueue samples
+        in a background thread"
+        https://bugs.webkit.org/show_bug.cgi?id=212073
+        https://trac.webkit.org/changeset/262289
+
 2020-05-27  Darin Adler  <da...@apple.com>
 
         Remove things from FeatureDefines.xcconfig that are covered by PlatformEnableCocoa.h

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h (262315 => 262316)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h	2020-05-29 20:28:30 UTC (rev 262315)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h	2020-05-29 21:06:04 UTC (rev 262316)
@@ -31,7 +31,6 @@
 #include <wtf/Deque.h>
 #include <wtf/Forward.h>
 #include <wtf/RetainPtr.h>
-#include <wtf/WorkQueue.h>
 
 OBJC_CLASS AVSampleBufferDisplayLayer;
 OBJC_CLASS WebAVSampleBufferStatusChangeListener;
@@ -38,7 +37,7 @@
 
 namespace WebCore {
 
-class WEBCORE_EXPORT LocalSampleBufferDisplayLayer final : public SampleBufferDisplayLayer, public CanMakeWeakPtr<LocalSampleBufferDisplayLayer, WeakPtrFactoryInitialization::Eager> {
+class WEBCORE_EXPORT LocalSampleBufferDisplayLayer final : public SampleBufferDisplayLayer, public CanMakeWeakPtr<LocalSampleBufferDisplayLayer> {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     static std::unique_ptr<LocalSampleBufferDisplayLayer> create(Client&);
@@ -79,7 +78,6 @@
     void removeOldSamplesFromPendingQueue();
     void addSampleToPendingQueue(MediaSample&);
     void requestNotificationWhenReadyForVideoData();
-    void enqueueSampleBuffer(MediaSample&);
 
 private:
     RetainPtr<WebAVSampleBufferStatusChangeListener> m_statusChangeListener;
@@ -86,10 +84,7 @@
     RetainPtr<AVSampleBufferDisplayLayer> m_sampleBufferDisplayLayer;
     RetainPtr<PlatformLayer> m_rootLayer;
     RenderPolicy m_renderPolicy { RenderPolicy::TimingInfo };
-    
-    RefPtr<WorkQueue> m_processingQueue;
 
-    // Only accessed through m_processingQueue or if m_processingQueue is null.
     using PendingSampleQueue = Deque<Ref<MediaSample>>;
     PendingSampleQueue m_pendingVideoSampleQueue;
 };

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm (262315 => 262316)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm	2020-05-29 20:28:30 UTC (rev 262315)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm	2020-05-29 21:06:04 UTC (rev 262316)
@@ -105,24 +105,33 @@
     UNUSED_PARAM(context);
     UNUSED_PARAM(keyPath);
     UNUSED_PARAM(change);
+    ASSERT(_parent);
 
-    if (![object isKindOfClass:PAL::getAVSampleBufferDisplayLayerClass()])
+    if (!_parent)
         return;
 
-    if ([keyPath isEqualToString:@"status"]) {
-        callOnMainThread([protectedSelf = RetainPtr<WebAVSampleBufferStatusChangeListener>(self)] {
-            if (protectedSelf->_parent)
+    if ([object isKindOfClass:PAL::getAVSampleBufferDisplayLayerClass()]) {
+        ASSERT(object == _parent->displayLayer());
+
+        if ([keyPath isEqualToString:@"status"]) {
+            callOnMainThread([protectedSelf = RetainPtr<WebAVSampleBufferStatusChangeListener>(self)] {
+                if (!protectedSelf->_parent)
+                    return;
+
                 protectedSelf->_parent->layerStatusDidChange();
-        });
-        return;
-    }
+            });
+            return;
+        }
 
-    if ([keyPath isEqualToString:@"error"]) {
-        callOnMainThread([protectedSelf = RetainPtr<WebAVSampleBufferStatusChangeListener>(self)] {
-            if (protectedSelf->_parent)
+        if ([keyPath isEqualToString:@"error"]) {
+            callOnMainThread([protectedSelf = RetainPtr<WebAVSampleBufferStatusChangeListener>(self)] {
+                if (!protectedSelf->_parent)
+                    return;
+
                 protectedSelf->_parent->layerErrorDidChange();
-        });
-        return;
+            });
+            return;
+        }
     }
 }
 @end
@@ -151,7 +160,6 @@
     : SampleBufferDisplayLayer(client)
     , m_statusChangeListener(adoptNS([[WebAVSampleBufferStatusChangeListener alloc] initWithParent:this]))
     , m_sampleBufferDisplayLayer(WTFMove(sampleBufferDisplayLayer))
-    , m_processingQueue(WorkQueue::create("LocalSampleBufferDisplayLayer queue"))
 {
 }
 
@@ -183,8 +191,6 @@
 
 LocalSampleBufferDisplayLayer::~LocalSampleBufferDisplayLayer()
 {
-    m_processingQueue = nullptr;
-
     [m_statusChangeListener stop];
 
     m_pendingVideoSampleQueue.clear();
@@ -275,16 +281,12 @@
 
 void LocalSampleBufferDisplayLayer::flush()
 {
-    m_processingQueue->dispatch([this] {
-        [m_sampleBufferDisplayLayer flush];
-    });
+    [m_sampleBufferDisplayLayer flush];
 }
 
 void LocalSampleBufferDisplayLayer::flushAndRemoveImage()
 {
-    m_processingQueue->dispatch([this] {
-        [m_sampleBufferDisplayLayer flushAndRemoveImage];
-    });
+    [m_sampleBufferDisplayLayer flushAndRemoveImage];
 }
 
 static const double rendererLatency = 0.02;
@@ -291,20 +293,12 @@
 
 void LocalSampleBufferDisplayLayer::enqueueSample(MediaSample& sample)
 {
-    m_processingQueue->dispatch([this, sample = makeRef(sample)] {
-        if (![m_sampleBufferDisplayLayer isReadyForMoreMediaData]) {
-            addSampleToPendingQueue(sample);
-            requestNotificationWhenReadyForVideoData();
-            return;
-        }
-        enqueueSampleBuffer(sample);
-    });
-}
+    if (![m_sampleBufferDisplayLayer isReadyForMoreMediaData]) {
+        addSampleToPendingQueue(sample);
+        requestNotificationWhenReadyForVideoData();
+        return;
+    }
 
-void LocalSampleBufferDisplayLayer::enqueueSampleBuffer(MediaSample& sample)
-{
-    ASSERT(!isMainThread());
-
     auto sampleToEnqueue = sample.platformSample().sample.cmSampleBuffer;
     auto now = MediaTime::createWithDouble(MonotonicTime::now().secondsSinceEpoch().value() + rendererLatency);
 
@@ -321,8 +315,6 @@
 
 void LocalSampleBufferDisplayLayer::removeOldSamplesFromPendingQueue()
 {
-    ASSERT(!isMainThread());
-
     if (m_pendingVideoSampleQueue.isEmpty())
         return;
 
@@ -342,8 +334,6 @@
 
 void LocalSampleBufferDisplayLayer::addSampleToPendingQueue(MediaSample& sample)
 {
-    ASSERT(!isMainThread());
-
     removeOldSamplesFromPendingQueue();
     m_pendingVideoSampleQueue.append(sample);
 }
@@ -350,15 +340,13 @@
 
 void LocalSampleBufferDisplayLayer::clearEnqueuedSamples()
 {
-    m_processingQueue->dispatch([this] {
-        m_pendingVideoSampleQueue.clear();
-    });
+    m_pendingVideoSampleQueue.clear();
 }
 
 void LocalSampleBufferDisplayLayer::requestNotificationWhenReadyForVideoData()
 {
     auto weakThis = makeWeakPtr(*this);
-    [m_sampleBufferDisplayLayer requestMediaDataWhenReadyOnQueue:m_processingQueue->dispatchQueue() usingBlock:^{
+    [m_sampleBufferDisplayLayer requestMediaDataWhenReadyOnQueue:dispatch_get_main_queue() usingBlock:^{
         if (!weakThis)
             return;
 
@@ -370,7 +358,8 @@
                 return;
             }
 
-            enqueueSampleBuffer(m_pendingVideoSampleQueue.takeFirst().get());
+            auto sample = m_pendingVideoSampleQueue.takeFirst();
+            enqueueSample(sample.get());
         }
     }];
 }

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h (262315 => 262316)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h	2020-05-29 20:28:30 UTC (rev 262315)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h	2020-05-29 21:06:04 UTC (rev 262316)
@@ -137,7 +137,6 @@
 
     void flushRenderers();
 
-    void processNewVideoSample(MediaSample&, bool hasChangedOrientation);
     void enqueueVideoSample(MediaSample&);
     void requestNotificationWhenReadyForVideoData();
 
@@ -213,6 +212,8 @@
 
     AudioSourceProvider* audioSourceProvider() final;
 
+    CGAffineTransform videoTransformationMatrix(MediaSample&, bool forceUpdate = false);
+
     void applicationDidBecomeActive() final;
 
     bool hideRootLayer() const { return (!activeVideoTrack() || m_waitingForFirstImage) && m_displayMode != PaintItBlack; }
@@ -245,17 +246,9 @@
     float m_volume { 1 };
     DisplayMode m_displayMode { None };
     PlaybackState m_playbackState { PlaybackState::None };
-    Optional<CGAffineTransform> m_videoTransform;
-
-    // Used on both main thread and sample thread.
+    MediaSample::VideoRotation m_videoRotation { MediaSample::VideoRotation::None };
+    CGAffineTransform m_videoTransform;
     std::unique_ptr<SampleBufferDisplayLayer> m_sampleBufferDisplayLayer;
-    Lock m_sampleBufferDisplayLayerLock;
-    bool m_shouldUpdateDisplayLayer { true };
-    // Written on main thread, read on sample thread.
-    bool m_canEnqueueDisplayLayer { false };
-    // Used on sample thread.
-    MediaSample::VideoRotation m_videoRotation { MediaSample::VideoRotation::None };
-    bool m_videoMirrored { false };
 
     Ref<const Logger> m_logger;
     const void* m_logIdentifier;
@@ -266,11 +259,13 @@
 
     RetainPtr<WebRootSampleBufferBoundsChangeListener> m_boundsChangeListener;
 
+    bool m_videoMirrored { false };
     bool m_playing { false };
     bool m_muted { false };
     bool m_ended { false };
     bool m_hasEverEnqueuedVideoFrame { false };
     bool m_pendingSelectedTrackCheck { false };
+    bool m_transformIsValid { false };
     bool m_visible { false };
     bool m_haveSeenMetadata { false };
     bool m_waitingForFirstImage { false };

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (262315 => 262316)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-05-29 20:28:30 UTC (rev 262315)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-05-29 21:06:04 UTC (rev 262316)
@@ -41,7 +41,6 @@
 #import <pal/avfoundation/MediaTimeAVFoundation.h>
 #import <pal/spi/cocoa/AVFoundationSPI.h>
 #import <pal/system/Clock.h>
-#import <wtf/Lock.h>
 #import <wtf/MainThread.h>
 #import <wtf/NeverDestroyed.h>
 
@@ -140,7 +139,7 @@
     , m_videoLayerManager(makeUnique<VideoLayerManagerObjC>(m_logger, m_logIdentifier))
 {
     INFO_LOG(LOGIDENTIFIER);
-    // MediaPlayerPrivateMediaStreamAVFObjC::processNewVideoSample expects a weak pointer to be created in the constructor.
+    // MediaPlayerPrivateMediaStreamAVFObjC::videoSampleAvailable expects a weak pointer to be created in the constructor.
     m_boundsChangeListener = adoptNS([[WebRootSampleBufferBoundsChangeListener alloc] initWithCallback:[this, weakThis = makeWeakPtr(this)] {
         if (!weakThis)
             return;
@@ -228,8 +227,11 @@
 #pragma mark -
 #pragma mark AVSampleBuffer Methods
 
-static inline CGAffineTransform videoTransformationMatrix(MediaSample& sample)
+CGAffineTransform MediaPlayerPrivateMediaStreamAVFObjC::videoTransformationMatrix(MediaSample& sample, bool forceUpdate)
 {
+    if (!forceUpdate && m_transformIsValid)
+        return m_videoTransform;
+
     CMSampleBufferRef sampleBuffer = sample.platformSample().sample.cmSampleBuffer;
     CVPixelBufferRef pixelBuffer = static_cast<CVPixelBufferRef>(CMSampleBufferGetImageBuffer(sampleBuffer));
     size_t width = CVPixelBufferGetWidth(pixelBuffer);
@@ -237,28 +239,19 @@
     if (!width || !height)
         return CGAffineTransformIdentity;
 
-    auto videoTransform = CGAffineTransformMakeRotation(static_cast<int>(sample.videoRotation()) * M_PI / 180);
+    ASSERT(m_videoRotation >= MediaSample::VideoRotation::None);
+    ASSERT(m_videoRotation <= MediaSample::VideoRotation::Left);
+
+    m_videoTransform = CGAffineTransformMakeRotation(static_cast<int>(m_videoRotation) * M_PI / 180);
     if (sample.videoMirrored())
-        videoTransform = CGAffineTransformScale(videoTransform, -1, 1);
+        m_videoTransform = CGAffineTransformScale(m_videoTransform, -1, 1);
 
-    return videoTransform;
+    m_transformIsValid = true;
+    return m_videoTransform;
 }
 
-void MediaPlayerPrivateMediaStreamAVFObjC::videoSampleAvailable(MediaSample& sample)
-{
-    processNewVideoSample(sample, sample.videoRotation() != m_videoRotation || sample.videoMirrored() != m_videoMirrored);
-    enqueueVideoSample(sample);
-}
-
 void MediaPlayerPrivateMediaStreamAVFObjC::enqueueVideoSample(MediaSample& sample)
 {
-    if (!m_canEnqueueDisplayLayer)
-        return;
-
-    auto locker = tryHoldLock(m_sampleBufferDisplayLayerLock);
-    if (!locker)
-        return;
-
     if (!m_sampleBufferDisplayLayer || m_sampleBufferDisplayLayer->didFail())
         return;
 
@@ -265,23 +258,18 @@
     if (sample.videoRotation() != m_videoRotation || sample.videoMirrored() != m_videoMirrored) {
         m_videoRotation = sample.videoRotation();
         m_videoMirrored = sample.videoMirrored();
-        m_sampleBufferDisplayLayer->updateAffineTransform(videoTransformationMatrix(sample));
-        m_shouldUpdateDisplayLayer = true;
+        m_sampleBufferDisplayLayer->updateAffineTransform(videoTransformationMatrix(sample, true));
+        updateDisplayLayer();
     }
-    if (m_shouldUpdateDisplayLayer) {
-        m_sampleBufferDisplayLayer->updateBoundsAndPosition(m_sampleBufferDisplayLayer->rootLayer().bounds, m_videoRotation);
-        m_shouldUpdateDisplayLayer = false;
-    }
-
     m_sampleBufferDisplayLayer->enqueueSample(sample);
 }
 
-void MediaPlayerPrivateMediaStreamAVFObjC::processNewVideoSample(MediaSample& sample,  bool hasChangedOrientation)
+void MediaPlayerPrivateMediaStreamAVFObjC::videoSampleAvailable(MediaSample& sample)
 {
     if (!isMainThread()) {
-        callOnMainThread([weakThis = makeWeakPtr(this), sample = makeRef(sample), hasChangedOrientation]() mutable {
+        callOnMainThread([weakThis = makeWeakPtr(this), sample = makeRef(sample)]() mutable {
             if (weakThis)
-                weakThis->processNewVideoSample(sample.get(), hasChangedOrientation);
+                weakThis->videoSampleAvailable(sample.get());
         });
         return;
     }
@@ -289,9 +277,6 @@
     if (!m_activeVideoTrack)
         return;
 
-    if (hasChangedOrientation)
-        m_videoTransform = { };
-
     if (!m_imagePainter.mediaSample || m_displayMode != PausedImage) {
         m_imagePainter.mediaSample = &sample;
         m_imagePainter.cgImage = nullptr;
@@ -302,6 +287,8 @@
     if (m_displayMode != LivePreview && !m_waitingForFirstImage)
         return;
 
+    enqueueVideoSample(sample);
+
     if (!m_hasEverEnqueuedVideoFrame) {
         m_hasEverEnqueuedVideoFrame = true;
         m_player->firstVideoFrameAvailable();
@@ -348,7 +335,6 @@
     if (!activeVideoTrack || !activeVideoTrack->enabled())
         return;
 
-    m_canEnqueueDisplayLayer = false;
     m_sampleBufferDisplayLayer = SampleBufferDisplayLayer::create(*this);
     ERROR_LOG_IF(!m_sampleBufferDisplayLayer, LOGIDENTIFIER, "Creating the SampleBufferDisplayLayer failed.");
     if (!m_sampleBufferDisplayLayer)
@@ -365,21 +351,16 @@
             return;
         }
         updateRenderingMode();
-        m_shouldUpdateDisplayLayer = true;
+        updateDisplayLayer();
 
         m_videoLayerManager->setVideoLayer(m_sampleBufferDisplayLayer->rootLayer(), size);
 
         [m_boundsChangeListener begin:m_sampleBufferDisplayLayer->rootLayer()];
-
-        m_canEnqueueDisplayLayer = true;
     });
 }
 
 void MediaPlayerPrivateMediaStreamAVFObjC::destroyLayers()
 {
-    m_canEnqueueDisplayLayer = false;
-
-    auto locker = holdLock(m_sampleBufferDisplayLayerLock);
     if (m_sampleBufferDisplayLayer)
         m_sampleBufferDisplayLayer = nullptr;
 
@@ -680,7 +661,7 @@
         return;
 
     scheduleDeferredTask([this] {
-        m_videoTransform = { };
+        m_transformIsValid = false;
         if (m_player)
             m_player->renderingModeChanged();
     });
@@ -963,9 +944,7 @@
 
     auto image = m_imagePainter.cgImage.get();
     FloatRect imageRect(0, 0, CGImageGetWidth(image), CGImageGetHeight(image));
-    if (!m_videoTransform)
-        m_videoTransform = videoTransformationMatrix(*m_imagePainter.mediaSample);
-    AffineTransform videoTransform = *m_videoTransform;
+    AffineTransform videoTransform = videoTransformationMatrix(*m_imagePainter.mediaSample);
     FloatRect transformedDestRect = videoTransform.inverse().valueOr(AffineTransform()).mapRect(destRect);
     context.concatCTM(videoTransform);
     context.drawNativeImage(image, imageRect.size(), transformedDestRect, imageRect);
@@ -1031,9 +1010,17 @@
     pixelBufferConformer = nullptr;
 }
 
+void MediaPlayerPrivateMediaStreamAVFObjC::updateDisplayLayer()
+{
+    if (!m_sampleBufferDisplayLayer)
+        return;
+
+    m_sampleBufferDisplayLayer->updateBoundsAndPosition(m_sampleBufferDisplayLayer->rootLayer().bounds, m_videoRotation);
+}
+
 void MediaPlayerPrivateMediaStreamAVFObjC::rootLayerBoundsDidChange()
 {
-    m_shouldUpdateDisplayLayer = true;
+    updateDisplayLayer();
 }
 
 WTFLogChannel& MediaPlayerPrivateMediaStreamAVFObjC::logChannel() const
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to