Changeset 278740 in webkit


Ignore:
Timestamp:
Jun 10, 2021, 4:51:37 PM (4 years ago)
Author:
eric.carlson@apple.com
Message:

[Cocoa] Remote video layer should respect video gravity when resizing
https://bugs.webkit.org/show_bug.cgi?id=226784

Reviewed by Jer Noble.

Tested manually.

  • WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:

(WebKit::MediaPlayerPrivateRemote::prepareForPlayback): Pass specify video gravity
when creating remote layer.
(WebKit::MediaPlayerPrivateRemote::setVideoFullscreenGravity): Remember gravity.

  • WebProcess/GPU/media/MediaPlayerPrivateRemote.h:
  • WebProcess/GPU/media/VideoLayerRemote.h:
  • WebProcess/GPU/media/cocoa/VideoLayerRemoteCocoa.h:
  • WebProcess/GPU/media/cocoa/VideoLayerRemoteCocoa.mm:

(-[WKVideoLayerRemote videoGravity]):
(-[WKVideoLayerRemote setVideoGravity:]):
(-[WKVideoLayerRemote resizePreservingGravity]): Return true when in PiP, fullscreen,
or when video gravity is not "resize".
(-[WKVideoLayerRemote layoutSublayers]): Preserve aspect ration when appropriate.
(WebKit::createVideoLayerRemote):

Location:
trunk/Source/WebKit
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r278738 r278740  
     12021-06-10  Eric Carlson  <eric.carlson@apple.com>
     2
     3        [Cocoa] Remote video layer should respect video gravity when resizing
     4        https://bugs.webkit.org/show_bug.cgi?id=226784
     5
     6        Reviewed by Jer Noble.
     7
     8        Tested manually.
     9
     10        * WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp:
     11        (WebKit::MediaPlayerPrivateRemote::prepareForPlayback): Pass specify video gravity
     12        when creating remote layer.
     13        (WebKit::MediaPlayerPrivateRemote::setVideoFullscreenGravity): Remember gravity.
     14        * WebProcess/GPU/media/MediaPlayerPrivateRemote.h:
     15
     16        * WebProcess/GPU/media/VideoLayerRemote.h:
     17        * WebProcess/GPU/media/cocoa/VideoLayerRemoteCocoa.h:
     18        * WebProcess/GPU/media/cocoa/VideoLayerRemoteCocoa.mm:
     19        (-[WKVideoLayerRemote videoGravity]):
     20        (-[WKVideoLayerRemote setVideoGravity:]):
     21        (-[WKVideoLayerRemote resizePreservingGravity]): Return true when in PiP, fullscreen,
     22        or when video gravity is not "resize".
     23        (-[WKVideoLayerRemote layoutSublayers]): Preserve aspect ration when appropriate.
     24        (WebKit::createVideoLayerRemote):
     25
    1262021-06-10  Alex Christensen  <achristensen@webkit.org>
    227
  • trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp

    r278646 r278740  
    152152            return;
    153153
    154         m_videoLayer = createVideoLayerRemote(this, inlineLayerHostingContextId.value());
     154        m_videoLayer = createVideoLayerRemote(this, inlineLayerHostingContextId.value(), m_videoFullscreenGravity);
    155155#if PLATFORM(COCOA)
    156156        m_videoLayerManager->setVideoLayer(m_videoLayer.get(), snappedIntRect(player->playerContentBoxRect()).size());
     
    816816void MediaPlayerPrivateRemote::setVideoFullscreenGravity(WebCore::MediaPlayerEnums::VideoGravity gravity)
    817817{
     818    m_videoFullscreenGravity = gravity;
    818819    connection().send(Messages::RemoteMediaPlayerProxy::SetVideoFullscreenGravity(gravity), m_id);
    819820}
  • trunk/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h

    r278646 r278740  
    427427    MonotonicTime m_cachedMediaTimeQueryTime;
    428428
     429    WebCore::MediaPlayer::VideoGravity m_videoFullscreenGravity { WebCore::MediaPlayer::VideoGravity::ResizeAspect };
    429430    MonotonicTime m_lastPlaybackQualityMetricsQueryTime;
    430431    Seconds m_videoPlaybackMetricsUpdateInterval;
  • trunk/Source/WebKit/WebProcess/GPU/media/VideoLayerRemote.h

    r258781 r278740  
    2929
    3030#include "LayerHostingContext.h"
     31#include <WebCore/MediaPlayerEnums.h>
    3132#include <WebCore/PlatformLayer.h>
    3233
     
    3536class MediaPlayerPrivateRemote;
    3637
    37 PlatformLayerContainer createVideoLayerRemote(MediaPlayerPrivateRemote*, LayerHostingContextID);
     38PlatformLayerContainer createVideoLayerRemote(MediaPlayerPrivateRemote*, LayerHostingContextID, WebCore::MediaPlayerEnums::VideoGravity);
    3839
    3940} // namespace WebKit
  • trunk/Source/WebKit/WebProcess/GPU/media/cocoa/VideoLayerRemoteCocoa.h

    r260366 r278740  
    2727
    2828#import <QuartzCore/CALayer.h>
     29#import <WebCore/MediaPlayerEnums.h>
    2930
    3031namespace WebKit {
     
    3536@property (nonatomic) WebKit::MediaPlayerPrivateRemote* mediaPlayerPrivateRemote;
    3637@property (nonatomic) CGRect videoLayerFrame;
     38@property (nonatomic) WebCore::MediaPlayerEnums::VideoGravity videoGravity;
    3739@end
    3840
  • trunk/Source/WebKit/WebProcess/GPU/media/cocoa/VideoLayerRemoteCocoa.mm

    r277242 r278740  
    4646    WeakPtr<WebKit::MediaPlayerPrivateRemote> _mediaPlayerPrivateRemote;
    4747    RetainPtr<CAContext> _context;
     48    WebCore::MediaPlayerEnums::VideoGravity _videoGravity;
    4849
    4950    std::unique_ptr<WebCore::Timer> _resolveBoundsTimer;
     
    8182}
    8283
     84- (WebCore::MediaPlayerEnums::VideoGravity)videoGravity
     85{
     86    return _videoGravity;
     87}
     88
     89- (void)setVideoGravity:(WebCore::MediaPlayerEnums::VideoGravity)videoGravity
     90{
     91    _videoGravity = videoGravity;
     92}
     93
     94- (bool)resizePreservingGravity
     95{
     96    auto* player = self.mediaPlayerPrivateRemote;
     97    if (player && player->inVideoFullscreenOrPictureInPicture())
     98        return true;
     99   
     100    return _videoGravity != WebCore::MediaPlayer::VideoGravity::Resize;
     101}
     102
    83103- (void)layoutSublayers
    84104{
     
    94114    CGAffineTransform transform = CGAffineTransformIdentity;
    95115    if (!sourceVideoFrame.isEmpty()) {
    96         if (auto* mediaPlayerPrivateRemote = self.mediaPlayerPrivateRemote; mediaPlayerPrivateRemote && mediaPlayerPrivateRemote->inVideoFullscreenOrPictureInPicture()) {
     116        if ([self resizePreservingGravity]) {
    97117            auto scale = std::fmax(targetVideoFrame.width() / sourceVideoFrame.width(), targetVideoFrame.height() / sourceVideoFrame.height());
    98118            transform = CGAffineTransformMakeScale(scale, scale);
     
    159179namespace WebKit {
    160180
    161 PlatformLayerContainer createVideoLayerRemote(MediaPlayerPrivateRemote* mediaPlayerPrivateRemote, LayerHostingContextID contextId)
     181PlatformLayerContainer createVideoLayerRemote(MediaPlayerPrivateRemote* mediaPlayerPrivateRemote, LayerHostingContextID contextId, WebCore::MediaPlayerEnums::VideoGravity videoGravity)
    162182{
    163183    // Initially, all the layers will be empty (both width and height are 0) and invisible.
     
    165185    auto videoLayerRemote = adoptNS([[WKVideoLayerRemote alloc] init]);
    166186    [videoLayerRemote setName:@"WKVideoLayerRemote"];
     187    [videoLayerRemote setVideoGravity:videoGravity];
    167188    [videoLayerRemote setMediaPlayerPrivateRemote:mediaPlayerPrivateRemote];
    168189    [videoLayerRemote addSublayer:LayerHostingContext::createPlatformLayerForHostingContext(contextId).get()];
  • trunk/Source/WebKit/WebProcess/GPU/media/win/VideoLayerRemoteWin.cpp

    r270175 r278740  
    3434namespace WebKit {
    3535
    36 PlatformLayerContainer createVideoLayerRemote(MediaPlayerPrivateRemote* mediaPlayerPrivateRemote, LayerHostingContextID contextId)
     36PlatformLayerContainer createVideoLayerRemote(MediaPlayerPrivateRemote*, LayerHostingContextID, WebCore::MediaPlayerEnums::VideoGravity)
    3737{
    3838    notImplemented();
Note: See TracChangeset for help on using the changeset viewer.