Title: [264312] trunk/Source
Revision
264312
Author
[email protected]
Date
2020-07-13 12:45:59 -0700 (Mon, 13 Jul 2020)

Log Message

Impossible to pause playback of MediaStream video track
https://bugs.webkit.org/show_bug.cgi?id=214262
<rdar://problem/65483729>

Reviewed by Jer Noble.

Source/WebCore:

These changes were tested manually because they don't change the behavior when
snapshotting or rendering to canvas.

* platform/graphics/avfoundation/SampleBufferDisplayLayer.h: Add pure virtual play
and pause methods.

* platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h:
(WebCore::LocalSampleBufferDisplayLayer::play): New, toggle m_paused.
(WebCore::LocalSampleBufferDisplayLayer::pause): Ditto.
* platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm:
(WebCore::LocalSampleBufferDisplayLayer::enqueueSample): Return early if paused.

* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::ensureLayers): Pause the display
layer if necessary.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::play): Start display layer.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::pause): Pause display layer.

Source/WebKit:

* GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.cpp:
(WebKit::RemoteSampleBufferDisplayLayer::play):
(WebKit::RemoteSampleBufferDisplayLayer::pause):
* GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.h:
* GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.messages.in:
* WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp:
(WebKit::SampleBufferDisplayLayer::play):
(WebKit::SampleBufferDisplayLayer::pause):
* WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (264311 => 264312)


--- trunk/Source/WebCore/ChangeLog	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebCore/ChangeLog	2020-07-13 19:45:59 UTC (rev 264312)
@@ -1,3 +1,29 @@
+2020-07-13  Eric Carlson  <[email protected]>
+
+        Impossible to pause playback of MediaStream video track
+        https://bugs.webkit.org/show_bug.cgi?id=214262
+        <rdar://problem/65483729>
+
+        Reviewed by Jer Noble.
+
+        These changes were tested manually because they don't change the behavior when
+        snapshotting or rendering to canvas.
+
+        * platform/graphics/avfoundation/SampleBufferDisplayLayer.h: Add pure virtual play
+        and pause methods.
+
+        * platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h:
+        (WebCore::LocalSampleBufferDisplayLayer::play): New, toggle m_paused.
+        (WebCore::LocalSampleBufferDisplayLayer::pause): Ditto.
+        * platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm:
+        (WebCore::LocalSampleBufferDisplayLayer::enqueueSample): Return early if paused.
+
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::ensureLayers): Pause the display
+        layer if necessary.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::play): Start display layer.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::pause): Pause display layer.
+
 2020-07-13  Sam Weinig  <[email protected]>
 
         Replace single argument makeSimpleColor uses with their implementation

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/SampleBufferDisplayLayer.h (264311 => 264312)


--- trunk/Source/WebCore/platform/graphics/avfoundation/SampleBufferDisplayLayer.h	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/SampleBufferDisplayLayer.h	2020-07-13 19:45:59 UTC (rev 264312)
@@ -63,6 +63,9 @@
     virtual void flush() = 0;
     virtual void flushAndRemoveImage() = 0;
 
+    virtual void play() = 0;
+    virtual void pause() = 0;
+
     virtual void enqueueSample(MediaSample&) = 0;
     virtual void clearEnqueuedSamples() = 0;
 

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


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.h	2020-07-13 19:45:59 UTC (rev 264312)
@@ -72,6 +72,9 @@
     void flush() final;
     void flushAndRemoveImage() final;
 
+    void play() final;
+    void pause() final;
+
     void enqueueSample(MediaSample&) final;
     void clearEnqueuedSamples() final;
     void setRenderPolicy(RenderPolicy) final;
@@ -97,6 +100,8 @@
     // Only accessed through m_processingQueue or if m_processingQueue is null.
     using PendingSampleQueue = Deque<Ref<MediaSample>>;
     PendingSampleQueue m_pendingVideoSampleQueue;
+    
+    bool m_paused { false };
 
 #if !RELEASE_LOG_DISABLED
     FrameRateMonitor m_frameRateMonitor;
@@ -108,6 +113,17 @@
     m_renderPolicy = renderPolicy;
 }
 
+inline void LocalSampleBufferDisplayLayer::play()
+{
+    m_paused = false;
 }
 
+inline void LocalSampleBufferDisplayLayer::pause()
+{
+    m_paused = true;
+}
+
+
+}
+
 #endif // ENABLE(MEDIA_STREAM) && USE(AVFOUNDATION)

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


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/LocalSampleBufferDisplayLayer.mm	2020-07-13 19:45:59 UTC (rev 264312)
@@ -301,6 +301,13 @@
 
 void LocalSampleBufferDisplayLayer::enqueueSample(MediaSample& sample)
 {
+    if (m_paused) {
+#if !RELEASE_LOG_DISABLED
+        m_frameRateMonitor.update();
+#endif
+        return;
+    }
+
     m_processingQueue->dispatch([this, sample = makeRef(sample)] {
         if (![m_sampleBufferDisplayLayer isReadyForMoreMediaData]) {
             WTFLogAlways("LocalSampleBufferDisplayLayer::enqueueSample not ready for more media data");

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


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-07-13 19:45:59 UTC (rev 264312)
@@ -351,6 +351,9 @@
     if (!m_sampleBufferDisplayLayer)
         return;
 
+    if (!playing())
+        m_sampleBufferDisplayLayer->pause();
+
     if (activeVideoTrack->source().isCaptureSource())
         m_sampleBufferDisplayLayer->setRenderPolicy(SampleBufferDisplayLayer::RenderPolicy::Immediately);
 
@@ -511,6 +514,8 @@
     for (const auto& track : m_audioTrackMap.values())
         track->play();
 
+    if (m_sampleBufferDisplayLayer)
+        m_sampleBufferDisplayLayer->play();
     updateDisplayMode();
 
     scheduleDeferredTask([this] {
@@ -533,6 +538,8 @@
     for (const auto& track : m_audioTrackMap.values())
         track->pause();
 
+    if (m_sampleBufferDisplayLayer)
+        m_sampleBufferDisplayLayer->pause();
     updateDisplayMode();
     flushRenderers();
 

Modified: trunk/Source/WebKit/ChangeLog (264311 => 264312)


--- trunk/Source/WebKit/ChangeLog	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebKit/ChangeLog	2020-07-13 19:45:59 UTC (rev 264312)
@@ -1,3 +1,21 @@
+2020-07-13  Eric Carlson  <[email protected]>
+
+        Impossible to pause playback of MediaStream video track
+        https://bugs.webkit.org/show_bug.cgi?id=214262
+        <rdar://problem/65483729>
+
+        Reviewed by Jer Noble.
+
+        * GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.cpp:
+        (WebKit::RemoteSampleBufferDisplayLayer::play):
+        (WebKit::RemoteSampleBufferDisplayLayer::pause):
+        * GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.h:
+        * GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.messages.in:
+        * WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp:
+        (WebKit::SampleBufferDisplayLayer::play):
+        (WebKit::SampleBufferDisplayLayer::pause):
+        * WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h:
+
 2020-07-13  Sam Weinig  <[email protected]>
 
         Replace single argument makeSimpleColor uses with their implementation

Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.cpp (264311 => 264312)


--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.cpp	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.cpp	2020-07-13 19:45:59 UTC (rev 264312)
@@ -96,6 +96,16 @@
     m_sampleBufferDisplayLayer->flushAndRemoveImage();
 }
 
+void RemoteSampleBufferDisplayLayer::play()
+{
+    m_sampleBufferDisplayLayer->play();
+}
+
+void RemoteSampleBufferDisplayLayer::pause()
+{
+    m_sampleBufferDisplayLayer->pause();
+}
+
 void RemoteSampleBufferDisplayLayer::enqueueSample(WebCore::RemoteVideoSample&& remoteSample)
 {
     if (!m_imageTransferSession || m_imageTransferSession->pixelFormat() != remoteSample.videoFormat())

Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.h (264311 => 264312)


--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.h	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.h	2020-07-13 19:45:59 UTC (rev 264312)
@@ -64,6 +64,8 @@
     void updateBoundsAndPosition(CGRect, WebCore::MediaSample::VideoRotation);
     void flush();
     void flushAndRemoveImage();
+    void play();
+    void pause();
     void enqueueSample(WebCore::RemoteVideoSample&&);
     void clearEnqueuedSamples();
 

Modified: trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.messages.in (264311 => 264312)


--- trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.messages.in	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebKit/GPUProcess/webrtc/RemoteSampleBufferDisplayLayer.messages.in	2020-07-13 19:45:59 UTC (rev 264312)
@@ -31,6 +31,8 @@
     FlushAndRemoveImage()
     EnqueueSample(WebCore::RemoteVideoSample sample)
     ClearEnqueuedSamples()
+    Play()
+    Pause()
 }
 
 #endif

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp (264311 => 264312)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.cpp	2020-07-13 19:45:59 UTC (rev 264312)
@@ -103,6 +103,16 @@
     m_connection->send(Messages::RemoteSampleBufferDisplayLayer::FlushAndRemoveImage { }, m_identifier);
 }
 
+void SampleBufferDisplayLayer::play()
+{
+    m_connection->send(Messages::RemoteSampleBufferDisplayLayer::Play { }, m_identifier);
+}
+
+void SampleBufferDisplayLayer::pause()
+{
+    m_connection->send(Messages::RemoteSampleBufferDisplayLayer::Pause { }, m_identifier);
+}
+
 void SampleBufferDisplayLayer::enqueueSample(MediaSample& sample)
 {
     if (auto remoteSample = RemoteVideoSample::create(sample))

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h (264311 => 264312)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h	2020-07-13 19:42:46 UTC (rev 264311)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/SampleBufferDisplayLayer.h	2020-07-13 19:45:59 UTC (rev 264312)
@@ -56,6 +56,8 @@
     void updateBoundsAndPosition(CGRect, WebCore::MediaSample::VideoRotation) final;
     void flush() final;
     void flushAndRemoveImage() final;
+    void play() final;
+    void pause() final;
     void enqueueSample(WebCore::MediaSample&) final;
     void clearEnqueuedSamples() final;
     PlatformLayer* rootLayer() final;
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to