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;