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