Title: [214953] trunk/Source/WebCore
Revision
214953
Author
[email protected]
Date
2017-04-05 11:34:24 -0700 (Wed, 05 Apr 2017)

Log Message

[MediaStream] Video doesn't render in fullscreen on iOS
https://bugs.webkit.org/show_bug.cgi?id=170404

Reviewed by Youenn Fablet.

No new tests, filed https://bugs.webkit.org/show_bug.cgi?id=170512.

* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::MediaPlayerPrivateMediaStreamAVFObjC): Include
video fullscreen manager on iOS too.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::videoTransformationMatrix): Add paramater
to force transform recalculation.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::enqueueVideoSample): Restructure code since
the display layer resize happens elsewhere.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::ensureLayers): Include video fullscreen
manager on iOS too.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::destroyLayers): Ditto.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::platformLayer): Ditto.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVideoFullscreenLayer): Ditto.
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::backgroundLayerBoundsChanged): Change the
display layer size and position immediately instead of waiting for the next sample buffer
so the display is correct when fullscreen mode changes when paused.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (214952 => 214953)


--- trunk/Source/WebCore/ChangeLog	2017-04-05 18:26:25 UTC (rev 214952)
+++ trunk/Source/WebCore/ChangeLog	2017-04-05 18:34:24 UTC (rev 214953)
@@ -1,3 +1,29 @@
+2017-04-05  Eric Carlson  <[email protected]>
+
+        [MediaStream] Video doesn't render in fullscreen on iOS
+        https://bugs.webkit.org/show_bug.cgi?id=170404
+
+        Reviewed by Youenn Fablet.
+        
+        No new tests, filed https://bugs.webkit.org/show_bug.cgi?id=170512.
+
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::MediaPlayerPrivateMediaStreamAVFObjC): Include
+        video fullscreen manager on iOS too.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::videoTransformationMatrix): Add paramater
+        to force transform recalculation.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::enqueueVideoSample): Restructure code since
+        the display layer resize happens elsewhere.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::ensureLayers): Include video fullscreen
+        manager on iOS too.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::destroyLayers): Ditto.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::platformLayer): Ditto.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::setVideoFullscreenLayer): Ditto.
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::backgroundLayerBoundsChanged): Change the
+        display layer size and position immediately instead of waiting for the next sample buffer
+        so the display is correct when fullscreen mode changes when paused.
+
 2017-04-05  Youenn Fablet  <[email protected]>
 
         Deprecate and remove URL.createObjectURL(mediastream)

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


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h	2017-04-05 18:26:25 UTC (rev 214952)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h	2017-04-05 18:34:24 UTC (rev 214953)
@@ -53,7 +53,7 @@
 class PixelBufferConformerCV;
 class VideoTrackPrivateMediaStream;
 
-#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
+#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
 class VideoFullscreenLayerManager;
 #endif
 
@@ -172,6 +172,7 @@
     void updateTracks();
     void updateRenderingMode();
     void checkSelectedVideoTrack();
+    void updateDisplayLayer();
 
     void scheduleDeferredTask(Function<void ()>&&);
 
@@ -206,7 +207,7 @@
     void sampleBufferUpdated(MediaStreamTrackPrivate&, MediaSample&) override;
     void readyStateChanged(MediaStreamTrackPrivate&) override;
 
-#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
+#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
     void setVideoFullscreenLayer(PlatformLayer*, std::function<void()> completionHandler) override;
     void setVideoFullscreenFrame(FloatRect) override;
 #endif
@@ -215,7 +216,7 @@
 
     AudioSourceProvider* audioSourceProvider() final;
 
-    CGAffineTransform videoTransformationMatrix(MediaSample&);
+    CGAffineTransform videoTransformationMatrix(MediaSample&, bool forceUpdate = false);
 
     MediaPlayer* m_player { nullptr };
     WeakPtrFactory<MediaPlayerPrivateMediaStreamAVFObjC> m_weakPtrFactory;
@@ -261,9 +262,8 @@
     bool m_pendingSelectedTrackCheck { false };
     bool m_shouldDisplayFirstVideoFrame { false };
     bool m_transformIsValid { false };
-    bool m_videoSizeChanged;
 
-#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
+#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
     std::unique_ptr<VideoFullscreenLayerManager> m_videoFullscreenLayerManager;
 #endif
 };

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


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2017-04-05 18:26:25 UTC (rev 214952)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2017-04-05 18:34:24 UTC (rev 214953)
@@ -44,7 +44,7 @@
 #import <wtf/MainThread.h>
 #import <wtf/NeverDestroyed.h>
 
-#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
+#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
 #import "VideoFullscreenLayerManager.h"
 #endif
 
@@ -190,7 +190,7 @@
     , m_weakPtrFactory(this)
     , m_statusChangeListener(adoptNS([[WebAVSampleBufferStatusChangeListener alloc] initWithParent:this]))
     , m_clock(Clock::create())
-#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
+#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
     , m_videoFullscreenLayerManager(VideoFullscreenLayerManager::create())
 #endif
 {
@@ -302,9 +302,9 @@
     return timelineOffset;
 }
 
-CGAffineTransform MediaPlayerPrivateMediaStreamAVFObjC::videoTransformationMatrix(MediaSample& sample)
+CGAffineTransform MediaPlayerPrivateMediaStreamAVFObjC::videoTransformationMatrix(MediaSample& sample, bool forceUpdate)
 {
-    if (m_transformIsValid)
+    if (!forceUpdate && m_transformIsValid)
         return m_videoTransform;
 
     CMSampleBufferRef sampleBuffer = sample.platformSample().sample.cmSampleBuffer;
@@ -373,19 +373,9 @@
         if (sample.videoOrientation() != m_videoOrientation || sample.videoMirrored() != m_videoMirrored) {
             m_videoOrientation = sample.videoOrientation();
             m_videoMirrored = sample.videoMirrored();
-            m_transformIsValid = false;
-        }
-
-        if (m_videoSizeChanged || !m_transformIsValid) {
             runWithoutAnimations([this, &sample] {
-                auto backgroundBounds = m_backgroundLayer.get().bounds;
-                auto videoBounds = backgroundBounds;
-                if (m_videoOrientation == MediaSample::VideoOrientation::LandscapeRight || m_videoOrientation == MediaSample::VideoOrientation::LandscapeLeft)
-                    std::swap(videoBounds.size.width, videoBounds.size.height);
-                m_sampleBufferDisplayLayer.get().bounds = videoBounds;
-                m_sampleBufferDisplayLayer.get().position = { backgroundBounds.size.width / 2, backgroundBounds.size.height / 2};
-                m_sampleBufferDisplayLayer.get().affineTransform = videoTransformationMatrix(sample);
-                m_videoSizeChanged = false;
+                m_sampleBufferDisplayLayer.get().affineTransform = videoTransformationMatrix(sample, true);
+                updateDisplayLayer();
             });
         }
 
@@ -491,8 +481,9 @@
 #endif
 
     updateRenderingMode();
-    
-#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
+    updateDisplayLayer();
+
+#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
     m_videoFullscreenLayerManager->setVideoLayer(m_backgroundLayer.get(), snappedIntRect(m_player->client().mediaPlayerContentBoxRect()).size());
 #endif
 }
@@ -510,7 +501,7 @@
 
     updateRenderingMode();
     
-#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
+#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
     m_videoFullscreenLayerManager->didDestroyVideoLayer();
 #endif
 }
@@ -578,7 +569,7 @@
     if (!m_backgroundLayer || m_displayMode == None)
         return nullptr;
 
-#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
+#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
     return m_videoFullscreenLayerManager->videoInlineLayer();
 #else
     return m_backgroundLayer.get();
@@ -869,9 +860,14 @@
     });
 }
 
-#if PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE)
-void MediaPlayerPrivateMediaStreamAVFObjC::setVideoFullscreenLayer(PlatformLayer *videoFullscreenLayer, std::function<void()> completionHandler)
+#if PLATFORM(IOS) || (PLATFORM(MAC) && ENABLE(VIDEO_PRESENTATION_MODE))
+void MediaPlayerPrivateMediaStreamAVFObjC::setVideoFullscreenLayer(PlatformLayer* videoFullscreenLayer, std::function<void()> completionHandler)
 {
+    if (m_videoFullscreenLayerManager->videoFullscreenLayer() == videoFullscreenLayer) {
+        completionHandler();
+        return;
+    }
+
     m_videoFullscreenLayerManager->setVideoFullscreenLayer(videoFullscreenLayer, completionHandler);
 }
 
@@ -1118,14 +1114,29 @@
     pixelBufferConformer = nullptr;
 }
 
-void MediaPlayerPrivateMediaStreamAVFObjC::backgroundLayerBoundsChanged()
+void MediaPlayerPrivateMediaStreamAVFObjC::updateDisplayLayer()
 {
     if (!m_backgroundLayer || !m_sampleBufferDisplayLayer)
         return;
 
-    m_videoSizeChanged = true;
+    auto backgroundBounds = m_backgroundLayer.get().bounds;
+    auto videoBounds = backgroundBounds;
+    if (m_videoOrientation == MediaSample::VideoOrientation::LandscapeRight || m_videoOrientation == MediaSample::VideoOrientation::LandscapeLeft)
+        std::swap(videoBounds.size.width, videoBounds.size.height);
+
+    m_sampleBufferDisplayLayer.get().bounds = videoBounds;
+    m_sampleBufferDisplayLayer.get().position = { backgroundBounds.size.width / 2, backgroundBounds.size.height / 2};
 }
 
+void MediaPlayerPrivateMediaStreamAVFObjC::backgroundLayerBoundsChanged()
+{
+    scheduleDeferredTask([this] {
+        runWithoutAnimations([this] {
+            updateDisplayLayer();
+        });
+    });
 }
 
+}
+
 #endif
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to