Changeset 187044 in webkit
- Timestamp:
- Jul 20, 2015, 4:27:49 PM (10 years ago)
- Location:
- trunk/Source
- Files:
-
- 14 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/Source/WebCore/ChangeLog ¶
r187043 r187044 1 2015-07-20 Jeremy Jones <jeremyj@apple.com> 2 3 Adopt AVPlayerLayerView 4 https://bugs.webkit.org/show_bug.cgi?id=146862 5 6 Reviewed by Jer Noble. 7 8 The CALayerHost is replaced with WebLayerHostView to be compatible with UIView animations. 9 Some animation is improved in the conversion. 10 11 WebAVPlayerLayerView and WebAVPictureInPicturePlayerLayerView derive from AVKit and UIKit respectively. 12 Because these frameworks are loaded at runtime, these classes must be generate using objc/runtime.h to 13 register them from c functions at runtime. The most important part of these UIViews is that their 14 backing layer is a WebAVPlayerLayer. 15 16 WebCALayerHostWrapper and WebAVVideoLayer are combined into WebAVPlayerLayer to simplify the hierarchy. 17 WebAVPlayerLayer is a stand-in for an AVPlayerLayer. 18 19 * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm: 20 (WebCore::MediaPlayerPrivateAVFoundationObjC::setVideoFullscreenLayer): -removeFromSuperlayer is redundant. 21 (WebCore::MediaPlayerPrivateAVFoundationObjC::setVideoFullscreenGravity): syncTextTrackBounds on change. 22 (WebCore::MediaPlayerPrivateAVFoundationObjC::setVideoFullscreenFrame): 23 We never want animation here, since all animation will happen in UIViews. 24 This is just for going into the final size after a transform based animation. 25 26 * platform/ios/WebVideoFullscreenControllerAVKit.mm: 27 (WebVideoFullscreenControllerContext::didSetupFullscreen): layer -> view 28 (WebVideoFullscreenControllerContext::didCleanupFullscreen): layer -> view 29 (WebVideoFullscreenControllerContext::setUpFullscreen): layer -> view 30 31 (WebVideoFullscreenControllerContext::setVideoLayerFrame): layer -> view 32 Use fence port to synchronize between the UIThread and the WebThread, 33 the same way WebKit2 uses a fence port to synchronize between processes. 34 35 (WebVideoFullscreenControllerContext::setVideoLayerGravity): 36 No longer necessary to cache videoGravity at this level. 37 38 * platform/ios/WebVideoFullscreenInterfaceAVKit.h: 39 * platform/ios/WebVideoFullscreenInterfaceAVKit.mm: 40 41 (-[WebAVPlayerLayer init]): 42 (-[WebAVPlayerLayer dealloc]): 43 (-[WebAVPlayerLayer playerController]): 44 (-[WebAVPlayerLayer setBounds:]): 45 (-[WebAVPlayerLayer resolveBounds]): 46 (-[WebAVPlayerLayer setVideoGravity:]): 47 (-[WebAVPlayerLayer videoGravity]): 48 (-[WebAVPlayerLayer videoRect]): 49 (+[WebAVPlayerLayer keyPathsForValuesAffectingVideoRect]): 50 Added class WebAVPlayerLayer, replacing WebAVVideoLayer and WebCALayerHostWrapper. 51 52 (WebAVPictureInPicturePlayerLayerView_layerClass): 53 (getWebAVPictureInPicturePlayerLayerViewClass): 54 Added runtime class WebAVPictureInPicturePlayerLayerView 55 56 (WebAVPlayerLayerView_layerClass): 57 (WebAVPlayerLayerView_playerController): 58 (WebAVPlayerLayerView_setPlayerController): 59 (WebAVPlayerLayerView_videoView): 60 (WebAVPlayerLayerView_setVideoView): 61 (WebAVPlayerLayerView_startRoutingVideoToPictureInPicturePlayerLayerView): 62 (WebAVPlayerLayerView_stopRoutingVideoToPictureInPicturePlayerLayerView): 63 (WebAVPlayerLayerView_pictureInPicturePlayerLayerView): 64 (getWebAVPlayerLayerViewClass): 65 Added runtime class WebAVPlayerLayerView 66 67 (WebVideoFullscreenInterfaceAVKit::setVideoDimensions): 68 Dimensions are also stored in WebAVPlayerLayer so it can make decisions about 69 animating the video layer. 70 71 (WebVideoFullscreenInterfaceAVKit::setExternalPlayback): 72 (WebVideoFullscreenInterfaceAVKit::enterFullscreen): 73 (WebVideoFullscreenInterfaceAVKit::didStopPictureInPicture): 74 (WebVideoFullscreenInterfaceAVKit::cleanupFullscreen): 75 Straightforward layer to view conversion. 76 77 (WebVideoFullscreenInterfaceAVKit::preparedToReturnToInline): 78 Set view frame using the view hierarchy instead of assuming it is directly in a window. 79 80 (WebVideoFullscreenInterfaceAVKit::exitFullscreen): 81 Set view frame using the view hierarchy instead of assuming it is directly in a window. 82 dispatch_async before calling didExitFullscreen() to allows CATransactions to complete. 83 84 (WebVideoFullscreenInterfaceAVKit::setupFullscreen): 85 Set view frame using the view hierarchy instead of assuming it is directly in a window. 86 dispatch_async before calling didSetupFullscreen() to allows CATransactions to complete. 87 88 (-[WebCALayerHostWrapper dealloc]): Deleted. 89 (-[WebCALayerHostWrapper setVideoSublayer:]): Deleted. 90 (-[WebCALayerHostWrapper videoSublayer]): Deleted. 91 (-[WebCALayerHostWrapper setBounds:]): Deleted. 92 (-[WebCALayerHostWrapper resolveBounds]): Deleted. 93 Class WebCALayerHostWrapper deleted. Functionality rolled into WebAVPlayerLayer. 94 95 (+[WebAVVideoLayer videoLayer]): Deleted. 96 (-[WebAVVideoLayer init]): Deleted. 97 (-[WebAVVideoLayer setPlayerViewController:]): Deleted. 98 (-[WebAVVideoLayer setVideoSublayer:]): Deleted. 99 (-[WebAVVideoLayer setBounds:]): Deleted. 100 (-[WebAVVideoLayer setVideoLayerGravity:]): Deleted. 101 (-[WebAVVideoLayer videoLayerGravity]): Deleted. 102 (-[WebAVVideoLayer enterPIPModeRedirectingVideoToLayer:]): Deleted. 103 (-[WebAVVideoLayer leavePIPMode]): Deleted. 104 Class WebAVVideoLayer deleted. Functionality rolled into WebAVPlayerLayer. 105 106 * platform/ios/WebVideoFullscreenModel.h: 107 * platform/ios/WebVideoFullscreenModelVideoElement.h: 108 * platform/ios/WebVideoFullscreenModelVideoElement.mm: 109 No need to store frame and gravity in the model. It is stored in the UI where it is used. 110 111 (WebVideoFullscreenModelVideoElement::videoLayerFrame): Deleted. 112 (WebVideoFullscreenModelVideoElement::videoLayerGravity): Deleted. 113 * platform/spi/cocoa/AVKitSPI.h: Add AVPlayerLayerView. 114 1 115 2015-07-20 Anders Carlsson <andersca@apple.com> 2 116 -
TabularUnified trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm ¶
r186563 r187044 1125 1125 1126 1126 if (m_videoFullscreenLayer && m_videoLayer) { 1127 [m_videoFullscreenLayer insertSublayer:m_videoLayer.get() atIndex:0]; 1127 1128 [m_videoLayer setFrame:CGRectMake(0, 0, m_videoFullscreenFrame.width(), m_videoFullscreenFrame.height())]; 1128 [m_videoLayer removeFromSuperlayer];1129 [m_videoFullscreenLayer insertSublayer:m_videoLayer.get() atIndex:0];1130 1129 newContext = [m_videoFullscreenLayer context]; 1131 1130 } else if (m_videoInlineLayer && m_videoLayer) { … … 1159 1158 1160 1159 if (m_videoLayer) { 1161 [m_videoLayer setStyle:nil]; // This enables actions, i.e. implicit animations.1162 [CATransaction begin];1163 1160 [m_videoLayer setFrame:CGRectMake(0, 0, frame.width(), frame.height())]; 1164 [CATransaction commit];1165 [m_videoLayer web_disableAllActions];1166 1161 } 1167 1162 syncTextTrackBounds(); … … 1183 1178 else 1184 1179 ASSERT_NOT_REACHED(); 1180 1181 if ([m_videoLayer videoGravity] == videoGravity) 1182 return; 1185 1183 1186 1184 [m_videoLayer setVideoGravity:videoGravity]; 1185 syncTextTrackBounds(); 1187 1186 } 1188 1187 -
TabularUnified trunk/Source/WebCore/platform/ios/WebVideoFullscreenControllerAVKit.mm ¶
r185727 r187044 31 31 32 32 #import "Logging.h" 33 #import "QuartzCoreSPI.h" 34 #import "SoftLinking.h" 33 35 #import "TimeRanges.h" 34 36 #import "WebVideoFullscreenInterfaceAVKit.h" … … 37 39 #import <WebCore/HTMLVideoElement.h> 38 40 #import <WebCore/WebCoreThreadRun.h> 41 42 SOFT_LINK_FRAMEWORK(UIKit) 43 SOFT_LINK_CLASS(UIKit, UIView) 39 44 40 45 using namespace WebCore; … … 130 135 virtual void requestExitFullscreen() override; 131 136 virtual void setVideoLayerFrame(FloatRect) override; 132 virtual FloatRect videoLayerFrame() const override { return m_frame; }133 137 virtual void setVideoLayerGravity(WebVideoFullscreenModel::VideoGravity) override; 134 virtual VideoGravity videoLayerGravity() const override { return m_gravity; }135 138 virtual void selectAudioMediaOption(uint64_t index) override; 136 139 virtual void selectLegibleMediaOption(uint64_t index) override; … … 140 143 RefPtr<WebVideoFullscreenModelVideoElement> m_model; 141 144 RefPtr<HTMLVideoElement> m_videoElement; 142 RetainPtr< PlatformLayer> m_videoFullscreenLayer;145 RetainPtr<UIView> m_videoFullscreenView; 143 146 RetainPtr<WebVideoFullscreenController> m_controller; 144 FloatRect m_frame;145 VideoGravity m_gravity;146 147 }; 147 148 … … 152 153 ASSERT(isUIThread()); 153 154 RefPtr<WebVideoFullscreenControllerContext> strongThis(this); 154 WebThreadRun([strongThis, this] { 155 m_model->setVideoFullscreenLayer(m_videoFullscreenLayer.get()); 155 RetainPtr<CALayer> videoFullscreenLayer = [m_videoFullscreenView layer]; 156 WebThreadRun([strongThis, this, videoFullscreenLayer] { 157 m_model->setVideoFullscreenLayer(videoFullscreenLayer.get()); 156 158 dispatch_async(dispatch_get_main_queue(), [strongThis, this] { 157 159 m_interface->enterFullscreen(); … … 178 180 m_interface->setWebVideoFullscreenChangeObserver(nullptr); 179 181 m_interface = nullptr; 182 m_videoFullscreenView = nil; 180 183 181 184 RefPtr<WebVideoFullscreenControllerContext> strongThis(this); … … 186 189 m_model = nullptr; 187 190 m_videoElement = nullptr; 188 m_videoFullscreenLayer = nil;189 191 190 192 [m_controller didFinishFullscreen:this]; … … 451 453 { 452 454 ASSERT(isUIThread()); 453 m_frame = frame; 454 RefPtr<WebVideoFullscreenControllerContext> strongThis(this); 455 WebThreadRun([strongThis, this, frame] { 455 RefPtr<WebVideoFullscreenControllerContext> strongThis(this); 456 RetainPtr<CALayer> videoFullscreenLayer = [m_videoFullscreenView layer]; 457 458 mach_port_name_t fencePort = [[videoFullscreenLayer context] createFencePort]; 459 460 WebThreadRun([strongThis, this, frame, fencePort, videoFullscreenLayer] { 461 [CATransaction begin]; 462 [CATransaction setAnimationDuration:0]; 456 463 if (m_model) 457 464 m_model->setVideoLayerFrame(frame); 465 [[videoFullscreenLayer context] setFencePort:fencePort]; 466 mach_port_deallocate(mach_task_self(), fencePort); 467 [CATransaction commit]; 458 468 }); 459 469 } … … 462 472 { 463 473 ASSERT(isUIThread()); 464 m_gravity = videoGravity;465 474 RefPtr<WebVideoFullscreenControllerContext> strongThis(this); 466 475 WebThreadRun([strongThis, this, videoGravity] { … … 511 520 m_interface->setWebVideoFullscreenChangeObserver(this); 512 521 m_interface->setWebVideoFullscreenModel(this); 522 m_videoFullscreenView = adoptNS([[getUIViewClass() alloc] init]); 513 523 514 524 RefPtr<WebVideoFullscreenControllerContext> strongThis(this); … … 517 527 m_model->setWebVideoFullscreenInterface(this); 518 528 m_model->setVideoElement(m_videoElement.get()); 519 m_videoFullscreenLayer = [CALayer layer];520 529 521 530 bool allowsPictureInPicture = m_videoElement->mediaSession().allowsPictureInPicture(*m_videoElement.get()); … … 523 532 524 533 dispatch_async(dispatch_get_main_queue(), [strongThis, this, videoElementClientRect, viewRef, mode, allowsPictureInPicture] { 525 m_interface->setupFullscreen(*m_videoFullscreen Layer.get(), videoElementClientRect, viewRef.get(), mode, allowsPictureInPicture);534 m_interface->setupFullscreen(*m_videoFullscreenView.get(), videoElementClientRect, viewRef.get(), mode, allowsPictureInPicture); 526 535 }); 527 536 }); -
TabularUnified trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h ¶
r186764 r187044 46 46 OBJC_CLASS UIView; 47 47 OBJC_CLASS CALayer; 48 OBJC_CLASS WebAV VideoLayer;49 OBJC_CLASS Web CALayerHostWrapper;48 OBJC_CLASS WebAVPlayerLayerView; 49 OBJC_CLASS WebAVPlayerLayer; 50 50 51 51 namespace WTF { … … 92 92 WEBCORE_EXPORT virtual void setExternalPlayback(bool enabled, ExternalPlaybackTargetType, WTF::String localizedDeviceName) override; 93 93 94 WEBCORE_EXPORT virtual void setupFullscreen( PlatformLayer&, const IntRect& initialRect, UIView *, HTMLMediaElementEnums::VideoFullscreenMode, bool allowsPictureInPicturePlayback);94 WEBCORE_EXPORT virtual void setupFullscreen(UIView&, const IntRect& initialRect, UIView *, HTMLMediaElementEnums::VideoFullscreenMode, bool allowsPictureInPicturePlayback); 95 95 WEBCORE_EXPORT virtual void enterFullscreen(); 96 96 WEBCORE_EXPORT virtual void exitFullscreen(const IntRect& finalRect); … … 134 134 RetainPtr<WebAVPlayerController> m_playerController; 135 135 RetainPtr<AVPlayerViewController> m_playerViewController; 136 RetainPtr<CALayer> m_videoLayer;137 RetainPtr<WebAVVideoLayer> m_videoLayerContainer;138 RetainPtr<WebCALayerHostWrapper> m_layerHostWrapper;139 136 WebVideoFullscreenModel* m_videoFullscreenModel { nullptr }; 140 137 WebVideoFullscreenChangeObserver* m_fullscreenChangeObserver { nullptr }; … … 145 142 RetainPtr<UIView> m_parentView; 146 143 RetainPtr<UIWindow> m_parentWindow; 144 RetainPtr<WebAVPlayerLayerView> m_playerLayerView; 147 145 HTMLMediaElementEnums::VideoFullscreenMode m_mode { HTMLMediaElementEnums::VideoFullscreenModeNone }; 148 146 std::function<void(bool)> m_prepareToInlineCallback; -
TabularUnified trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm ¶
r187036 r187044 40 40 #import <AVFoundation/AVTime.h> 41 41 #import <UIKit/UIKit.h> 42 #import <objc/message.h> 43 #import <objc/runtime.h> 42 44 #import <wtf/RetainPtr.h> 43 45 #import <wtf/text/CString.h> … … 51 53 SOFT_LINK_FRAMEWORK(AVFoundation) 52 54 SOFT_LINK_CLASS(AVFoundation, AVPlayerLayer) 55 SOFT_LINK_CONSTANT(AVFoundation, AVLayerVideoGravityResize, NSString *) 56 SOFT_LINK_CONSTANT(AVFoundation, AVLayerVideoGravityResizeAspect, NSString *) 57 SOFT_LINK_CONSTANT(AVFoundation, AVLayerVideoGravityResizeAspectFill, NSString *) 53 58 54 59 SOFT_LINK_FRAMEWORK(AVKit) … … 56 61 SOFT_LINK_CLASS(AVKit, AVPlayerViewController) 57 62 SOFT_LINK_CLASS(AVKit, AVValueTiming) 63 SOFT_LINK_CLASS(AVKit, AVPlayerLayerView) 64 SOFT_LINK_CLASS(AVKit, AVPictureInPicturePlayerLayerView) 58 65 59 66 SOFT_LINK_FRAMEWORK(UIKit) … … 75 82 @class WebAVMediaSelectionOption; 76 83 77 @interface WebAVPlayerController : NSObject <AVPlayerViewControllerDelegate> 78 { 84 @interface WebAVPlayerController : NSObject <AVPlayerViewControllerDelegate> { 79 85 WebAVMediaSelectionOption *_currentAudioMediaSelectionOption; 80 86 WebAVMediaSelectionOption *_currentLegibleMediaSelectionOption; 81 87 } 82 88 83 - (void)resetState;89 - (void)resetState; 84 90 85 91 @property (retain) AVPlayerController* playerControllerProxy; … … 151 157 } 152 158 153 -(void)resetState { 159 - (void)resetState 160 { 154 161 self.contentDuration = 0; 155 162 self.maxTime = 0; … … 182 189 } 183 190 184 - (AVPlayer*) player { 191 - (AVPlayer *) player 192 { 185 193 return nil; 186 194 } … … 569 577 @end 570 578 571 572 @interface WebCALayerHostWrapper : CALayer 573 @property (assign) WebVideoFullscreenModel* model; 579 @interface WebAVPlayerLayer : CALayer 580 @property (nonatomic, retain) NSString *videoGravity; 581 @property (nonatomic, getter=isReadyForDisplay) BOOL readyForDisplay; 582 @property (nonatomic, retain) AVPlayerController *playerController; 583 @property (nonatomic, retain) CALayer *videoSublayer; 584 @property (nonatomic, copy, nullable) NSDictionary *pixelBufferAttributes; 585 @property CGSize videoDimensions; 586 @property CGRect modelVideoLayerFrame; 574 587 @end 575 588 576 @implementation WebCALayerHostWrapper { 589 @implementation WebAVPlayerLayer { 590 RetainPtr<WebAVPlayerController> _avPlayerController; 577 591 RetainPtr<CALayer> _videoSublayer; 578 } 579 580 - (void)dealloc 581 { 582 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil]; 583 [super dealloc]; 584 } 585 586 - (void)setVideoSublayer:(CALayer*)videoSublayer 587 { 588 _videoSublayer = videoSublayer; 589 [self addSublayer:videoSublayer]; 590 } 591 592 - (CALayer*)videoSublayer 593 { 594 return _videoSublayer.get(); 595 } 596 597 - (void)setBounds:(CGRect)bounds 598 { 599 if (CGRectEqualToRect(bounds, self.bounds)) 600 return; 601 602 [super setBounds:bounds]; 603 604 [_videoSublayer setPosition:CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))]; 605 606 if (!self.model) 607 return; 608 609 FloatRect videoFrame = self.model->videoLayerFrame(); 610 FloatRect targetFrame; 611 switch (self.model->videoLayerGravity()) { 612 case WebCore::WebVideoFullscreenModel::VideoGravityResize: 613 targetFrame = bounds; 614 break; 615 case WebCore::WebVideoFullscreenModel::VideoGravityResizeAspect: 616 targetFrame = largestRectWithAspectRatioInsideRect(videoFrame.size().aspectRatio(), bounds); 617 break; 618 case WebCore::WebVideoFullscreenModel::VideoGravityResizeAspectFill: 619 targetFrame = smallestRectWithAspectRatioAroundRect(videoFrame.size().aspectRatio(), bounds); 620 break; 621 } 622 CATransform3D transform = CATransform3DMakeScale(targetFrame.width() / videoFrame.width(), targetFrame.height() / videoFrame.height(), 1); 623 [_videoSublayer setSublayerTransform:transform]; 624 625 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil]; 626 [self performSelector:@selector(resolveBounds) withObject:nil afterDelay:[CATransaction animationDuration] + 0.1]; 627 } 628 629 - (void)resolveBounds 630 { 631 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil]; 632 if (!self.model) 633 return; 634 635 [CATransaction begin]; 636 [CATransaction setAnimationDuration:0]; 637 638 [_videoSublayer setSublayerTransform:CATransform3DIdentity]; 639 self.model->setVideoLayerFrame([self bounds]); 640 641 [CATransaction commit]; 642 } 643 @end 644 645 @interface WebAVVideoLayer : CALayer <AVVideoLayer> 646 +(WebAVVideoLayer *)videoLayer; 647 @property (nonatomic) AVVideoLayerGravity videoLayerGravity; 648 @property (nonatomic, getter = isReadyForDisplay) BOOL readyForDisplay; 649 @property (nonatomic) CGRect videoRect; 650 - (void)setPlayerViewController:(AVPlayerViewController *)playerViewController; 651 - (void)setPlayerController:(AVPlayerController *)playerController; 652 @property (nonatomic, retain) CALayer* videoSublayer; 653 @end 654 655 @implementation WebAVVideoLayer 656 { 657 RetainPtr<WebAVPlayerController> _avPlayerController; 658 RetainPtr<AVPlayerViewController> _avPlayerViewController; 659 RetainPtr<CALayer> _videoSublayer; 660 AVVideoLayerGravity _videoLayerGravity; 661 } 662 663 +(WebAVVideoLayer *)videoLayer 664 { 665 return [[[WebAVVideoLayer alloc] init] autorelease]; 592 RetainPtr<NSString> _videoGravity; 666 593 } 667 594 … … 671 598 if (self) { 672 599 [self setMasksToBounds:YES]; 673 [self setVideoLayerGravity:AVVideoLayerGravityResizeAspect];600 _videoGravity = getAVLayerVideoGravityResizeAspect(); 674 601 } 675 602 return self; 676 603 } 677 604 605 - (void)dealloc 606 { 607 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil]; 608 [super dealloc]; 609 } 610 611 - (AVPlayerController *)playerController 612 { 613 return (AVPlayerController *)_avPlayerController.get(); 614 } 615 678 616 - (void)setPlayerController:(AVPlayerController *)playerController 679 617 { … … 682 620 } 683 621 684 - (void)setPlayerViewController:(AVPlayerViewController *)playerViewController685 {686 _avPlayerViewController = playerViewController;687 }688 689 622 - (void)setVideoSublayer:(CALayer *)videoSublayer 690 623 { 691 624 _videoSublayer = videoSublayer; 692 [self addSublayer:videoSublayer];693 625 } 694 626 … … 700 632 - (void)setBounds:(CGRect)bounds 701 633 { 634 if (CGRectEqualToRect(bounds, self.bounds)) 635 return; 636 702 637 [super setBounds:bounds]; 703 704 if ([_videoSublayer superlayer] == self) { 705 [_videoSublayer setPosition:CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))]; 706 [_videoSublayer setBounds:bounds]; 707 } 708 } 709 710 - (void)setVideoLayerGravity:(AVVideoLayerGravity)videoLayerGravity 711 { 712 _videoLayerGravity = videoLayerGravity; 638 639 if ([_videoSublayer superlayer] != self) 640 return; 641 642 [_videoSublayer setPosition:CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds))]; 713 643 714 644 if (![_avPlayerController delegate]) 715 645 return; 716 646 647 FloatRect sourceVideoFrame; 648 FloatRect targetVideoFrame; 649 float videoAspectRatio = self.videoDimensions.width / self.videoDimensions.height; 650 651 if ([getAVLayerVideoGravityResize() isEqualToString:self.videoGravity]) { 652 sourceVideoFrame = self.modelVideoLayerFrame; 653 targetVideoFrame = self.bounds; 654 } else if ([getAVLayerVideoGravityResizeAspect() isEqualToString:self.videoGravity]) { 655 sourceVideoFrame = largestRectWithAspectRatioInsideRect(videoAspectRatio, self.modelVideoLayerFrame); 656 targetVideoFrame = largestRectWithAspectRatioInsideRect(videoAspectRatio, self.bounds); 657 } else if ([getAVLayerVideoGravityResizeAspectFill() isEqualToString:self.videoGravity]) { 658 sourceVideoFrame = smallestRectWithAspectRatioAroundRect(videoAspectRatio, self.modelVideoLayerFrame); 659 self.modelVideoLayerFrame = CGRectMake(0, 0, sourceVideoFrame.width(), sourceVideoFrame.height()); 660 [_avPlayerController delegate]->setVideoLayerFrame(self.modelVideoLayerFrame); 661 targetVideoFrame = smallestRectWithAspectRatioAroundRect(videoAspectRatio, self.bounds); 662 } else 663 ASSERT_NOT_REACHED(); 664 665 UIView *view = [_videoSublayer delegate]; 666 CGAffineTransform transform = CGAffineTransformMakeScale(targetVideoFrame.width() / sourceVideoFrame.width(), targetVideoFrame.height() / sourceVideoFrame.height()); 667 [view setTransform:transform]; 668 669 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil]; 670 671 if (!CGAffineTransformEqualToTransform(CGAffineTransformIdentity, transform)) 672 [self performSelector:@selector(resolveBounds) withObject:nil afterDelay:[CATransaction animationDuration] + 0.1]; 673 } 674 675 - (void)resolveBounds 676 { 677 [NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(resolveBounds) object:nil]; 678 if (![_avPlayerController delegate]) 679 return; 680 681 if ([_videoSublayer superlayer] != self) 682 return; 683 684 [CATransaction begin]; 685 [CATransaction setAnimationDuration:0]; 686 687 [(UIView *)[_videoSublayer delegate] setTransform:CGAffineTransformIdentity]; 688 self.modelVideoLayerFrame = [self bounds]; 689 [_avPlayerController delegate]->setVideoLayerFrame(self.modelVideoLayerFrame); 690 691 [CATransaction commit]; 692 } 693 694 - (void)setVideoGravity:(NSString *)videoGravity 695 { 696 _videoGravity = videoGravity; 697 698 if (![_avPlayerController delegate]) 699 return; 700 717 701 WebCore::WebVideoFullscreenModel::VideoGravity gravity = WebCore::WebVideoFullscreenModel::VideoGravityResizeAspect; 718 if (video LayerGravity == AVVideoLayerGravityResize)702 if (videoGravity == getAVLayerVideoGravityResize()) 719 703 gravity = WebCore::WebVideoFullscreenModel::VideoGravityResize; 720 if (video LayerGravity == AVVideoLayerGravityResizeAspect)704 if (videoGravity == getAVLayerVideoGravityResizeAspect()) 721 705 gravity = WebCore::WebVideoFullscreenModel::VideoGravityResizeAspect; 722 else if (video LayerGravity == AVVideoLayerGravityResizeAspectFill)706 else if (videoGravity == getAVLayerVideoGravityResizeAspectFill()) 723 707 gravity = WebCore::WebVideoFullscreenModel::VideoGravityResizeAspectFill; 724 708 else … … 728 712 } 729 713 730 - (AVVideoLayerGravity)videoLayerGravity 731 { 732 return _videoLayerGravity; 733 } 734 735 - (void)enterPIPModeRedirectingVideoToLayer:(CALayer *)layer 736 { 737 [_videoSublayer removeFromSuperlayer]; 738 [layer addSublayer:_videoSublayer.get()]; 739 } 740 741 - (void)leavePIPMode 742 { 743 [_videoSublayer removeFromSuperlayer]; 744 [self addSublayer:_videoSublayer.get()]; 745 } 714 - (NSString *)videoGravity 715 { 716 return _videoGravity.get(); 717 } 718 719 - (CGRect)videoRect 720 { 721 float videoAspectRatio = self.videoDimensions.width / self.videoDimensions.height; 722 723 if ([getAVLayerVideoGravityResizeAspect() isEqualToString:self.videoGravity]) 724 return largestRectWithAspectRatioInsideRect(videoAspectRatio, self.bounds); 725 if ([getAVLayerVideoGravityResizeAspectFill() isEqualToString:self.videoGravity]) 726 return smallestRectWithAspectRatioAroundRect(videoAspectRatio, self.bounds); 727 728 return self.bounds; 729 } 730 731 + (NSSet *)keyPathsForValuesAffectingVideoRect 732 { 733 return [NSSet setWithObjects:@"videoDimensions", @"videoGravity", nil]; 734 } 735 746 736 @end 737 738 @interface WebAVPictureInPicturePlayerLayerView : AVPictureInPicturePlayerLayerView 739 @end 740 741 static CALayer* WebAVPictureInPicturePlayerLayerView_layerClass(id, SEL) 742 { 743 return [WebAVPlayerLayer class]; 744 } 745 746 static Class getWebAVPictureInPicturePlayerLayerViewClass() 747 { 748 static Class theClass = nil; 749 static dispatch_once_t onceToken; 750 dispatch_once(&onceToken, ^{ 751 theClass = objc_allocateClassPair(getAVPictureInPicturePlayerLayerViewClass(), "WebAVPictureInPicturePlayerLayerView", 0); 752 objc_registerClassPair(theClass); 753 Class metaClass = objc_getMetaClass("WebAVPictureInPicturePlayerLayerView"); 754 class_addMethod(metaClass, @selector(layerClass), (IMP)WebAVPictureInPicturePlayerLayerView_layerClass, "@@:"); 755 }); 756 757 return theClass; 758 } 759 760 @interface WebAVPlayerLayerView : AVPlayerLayerView 761 @property (retain) UIView* videoView; 762 @end 763 764 static CALayer* WebAVPlayerLayerView_layerClass(id, SEL) 765 { 766 return [WebAVPlayerLayer class]; 767 } 768 769 static AVPlayerController* WebAVPlayerLayerView_playerController(id aSelf, SEL) 770 { 771 AVPlayerLayerView *playerLayer = aSelf; 772 WebAVPlayerLayer *webAVPlayerLayer = (WebAVPlayerLayer *)[playerLayer playerLayer]; 773 return [webAVPlayerLayer playerController]; 774 } 775 776 static void WebAVPlayerLayerView_setPlayerController(id aSelf, SEL, AVPlayerController *playerController) 777 { 778 AVPlayerLayerView *playerLayerView = aSelf; 779 WebAVPlayerLayer *webAVPlayerLayer = (WebAVPlayerLayer *)[playerLayerView playerLayer]; 780 [webAVPlayerLayer setPlayerController: playerController]; 781 } 782 783 static UIView* WebAVPlayerLayerView_videoView(id aSelf, SEL) 784 { 785 AVPlayerLayerView *playerLayer = aSelf; 786 WebAVPlayerLayer *webAVPlayerLayer = (WebAVPlayerLayer *)[playerLayer playerLayer]; 787 CALayer* videoLayer = [webAVPlayerLayer videoSublayer]; 788 if (!videoLayer) 789 return nil; 790 ASSERT([[videoLayer delegate] isKindOfClass:getUIViewClass()]); 791 return (UIView *)[videoLayer delegate]; 792 } 793 794 static void WebAVPlayerLayerView_setVideoView(id aSelf, SEL, UIView *videoView) 795 { 796 AVPlayerLayerView *playerLayerView = aSelf; 797 WebAVPlayerLayer *webAVPlayerLayer = (WebAVPlayerLayer *)[playerLayerView playerLayer]; 798 [webAVPlayerLayer setVideoSublayer:[videoView layer]]; 799 } 800 801 static void WebAVPlayerLayerView_startRoutingVideoToPictureInPicturePlayerLayerView(id aSelf, SEL) 802 { 803 WebAVPlayerLayerView *playerLayerView = aSelf; 804 AVPictureInPicturePlayerLayerView *pipView = [playerLayerView pictureInPicturePlayerLayerView]; 805 806 WebAVPlayerLayer *playerLayer = (WebAVPlayerLayer *)[playerLayerView playerLayer]; 807 WebAVPlayerLayer *pipPlayerLayer = (WebAVPlayerLayer *)[pipView playerLayer]; 808 [playerLayer setVideoGravity:getAVLayerVideoGravityResizeAspect()]; 809 [pipPlayerLayer setVideoSublayer:playerLayer.videoSublayer]; 810 [pipPlayerLayer setVideoDimensions:playerLayer.videoDimensions]; 811 [pipPlayerLayer setVideoGravity:playerLayer.videoGravity]; 812 [pipPlayerLayer setModelVideoLayerFrame:playerLayer.modelVideoLayerFrame]; 813 [pipPlayerLayer setPlayerController:playerLayer.playerController]; 814 [pipView addSubview:playerLayerView.videoView]; 815 } 816 817 static void WebAVPlayerLayerView_stopRoutingVideoToPictureInPicturePlayerLayerView(id aSelf, SEL) 818 { 819 WebAVPlayerLayerView *playerLayerView = aSelf; 820 [playerLayerView addSubview:playerLayerView.videoView]; 821 } 822 823 static AVPictureInPicturePlayerLayerView *WebAVPlayerLayerView_pictureInPicturePlayerLayerView(id aSelf, SEL) 824 { 825 WebAVPlayerLayerView *playerLayerView = aSelf; 826 WebAVPictureInPicturePlayerLayerView *pipView = [playerLayerView valueForKey:@"_pictureInPicturePlayerLayerView"]; 827 if (!pipView) { 828 pipView = [[getWebAVPictureInPicturePlayerLayerViewClass() alloc] initWithFrame:CGRectZero]; 829 [playerLayerView setValue:pipView forKey:@"_pictureInPicturePlayerLayerView"]; 830 } 831 return pipView; 832 } 833 834 static void WebAVPlayerLayerView_dealloc(id aSelf, SEL) 835 { 836 WebAVPlayerLayerView *playerLayerView = aSelf; 837 RetainPtr<WebAVPictureInPicturePlayerLayerView> pipView = adoptNS([playerLayerView valueForKey:@"_pictureInPicturePlayerLayerView"]); 838 [playerLayerView setValue:nil forKey:@"_pictureInPicturePlayerLayerView"]; 839 objc_super superClass { playerLayerView, getAVPlayerLayerViewClass() }; 840 auto super_dealloc = reinterpret_cast<void(*)(objc_super*, SEL)>(objc_msgSendSuper); 841 super_dealloc(&superClass, @selector(dealloc)); 842 } 843 844 #pragma mark - Methods 845 846 static Class getWebAVPlayerLayerViewClass() 847 { 848 static Class theClass = nil; 849 static dispatch_once_t onceToken; 850 dispatch_once(&onceToken, ^{ 851 theClass = objc_allocateClassPair(getAVPlayerLayerViewClass(), "WebAVPlayerLayerView", 0); 852 class_addMethod(theClass, @selector(dealloc), (IMP)WebAVPlayerLayerView_dealloc, "v@:"); 853 class_addMethod(theClass, @selector(setPlayerController:), (IMP)WebAVPlayerLayerView_setPlayerController, "v@:@"); 854 class_addMethod(theClass, @selector(playerController), (IMP)WebAVPlayerLayerView_playerController, "@@:"); 855 class_addMethod(theClass, @selector(setVideoView:), (IMP)WebAVPlayerLayerView_setVideoView, "v@:@"); 856 class_addMethod(theClass, @selector(videoView), (IMP)WebAVPlayerLayerView_videoView, "@@:"); 857 class_addMethod(theClass, @selector(startRoutingVideoToPictureInPicturePlayerLayerView), (IMP)WebAVPlayerLayerView_startRoutingVideoToPictureInPicturePlayerLayerView, "v@:"); 858 class_addMethod(theClass, @selector(stopRoutingVideoToPictureInPicturePlayerLayerView), (IMP)WebAVPlayerLayerView_stopRoutingVideoToPictureInPicturePlayerLayerView, "v@:"); 859 class_addMethod(theClass, @selector(pictureInPicturePlayerLayerView), (IMP)WebAVPlayerLayerView_pictureInPicturePlayerLayerView, "@@:"); 860 861 class_addIvar(theClass, "_pictureInPicturePlayerLayerView", sizeof(WebAVPictureInPicturePlayerLayerView *), log2(sizeof(WebAVPictureInPicturePlayerLayerView *)), "@"); 862 863 objc_registerClassPair(theClass); 864 Class metaClass = objc_getMetaClass("WebAVPlayerLayerView"); 865 class_addMethod(metaClass, @selector(layerClass), (IMP)WebAVPlayerLayerView_layerClass, "@@:"); 866 }); 867 return theClass; 868 } 747 869 748 870 WebVideoFullscreenInterfaceAVKit::WebVideoFullscreenInterfaceAVKit() … … 827 949 void WebVideoFullscreenInterfaceAVKit::setVideoDimensions(bool hasVideo, float width, float height) 828 950 { 951 WebAVPlayerLayer *playerLayer = (WebAVPlayerLayer *)[m_playerLayerView playerLayer]; 952 953 [playerLayer setVideoDimensions:CGSizeMake(width, height)]; 829 954 [m_playerController setHasEnabledVideo:hasVideo]; 830 955 [m_playerController setContentDimensions:CGSizeMake(width, height)]; … … 891 1016 playerController.externalPlaybackType = externalPlaybackType; 892 1017 playerController.externalPlaybackActive = enabled; 893 [m_ videoLayerContainer.get()setHidden:enabled];1018 [m_playerLayerView setHidden:enabled]; 894 1019 } 895 1020 896 1021 @interface UIWindow () 897 - (BOOL)_isHostedInAnotherProcess;1022 - (BOOL)_isHostedInAnotherProcess; 898 1023 @end 899 1024 … … 902 1027 @end 903 1028 904 void WebVideoFullscreenInterfaceAVKit::setupFullscreen( PlatformLayer& videoLayer, const WebCore::IntRect& initialRect, UIView* parentView, HTMLMediaElementEnums::VideoFullscreenMode mode, bool allowsPictureInPicturePlayback)1029 void WebVideoFullscreenInterfaceAVKit::setupFullscreen(UIView& videoView, const WebCore::IntRect& initialRect, UIView* parentView, HTMLMediaElementEnums::VideoFullscreenMode mode, bool allowsPictureInPicturePlayback) 905 1030 { 906 1031 ASSERT(mode != HTMLMediaElementEnums::VideoFullscreenModeNone); … … 911 1036 [CATransaction begin]; 912 1037 [CATransaction setDisableActions:YES]; 913 m_videoLayer = &videoLayer;914 1038 m_mode = mode; 915 1039 m_parentView = parentView; … … 926 1050 } 927 1051 928 [m_videoLayer removeFromSuperlayer]; 929 930 m_layerHostWrapper = adoptNS([[WebCALayerHostWrapper alloc] init]); 931 [m_layerHostWrapper setModel:m_videoFullscreenModel]; 932 [m_layerHostWrapper setVideoSublayer:m_videoLayer.get()]; 933 934 m_videoLayerContainer = [WebAVVideoLayer videoLayer]; 935 [m_videoLayerContainer setHidden:[m_playerController isExternalPlaybackActive]]; 936 [m_videoLayerContainer setVideoSublayer:m_layerHostWrapper.get()]; 937 938 CGSize videoSize = [m_playerController contentDimensions]; 939 CGRect videoRect = CGRectMake(0, 0, videoSize.width, videoSize.height); 940 [m_videoLayerContainer setVideoRect:videoRect]; 941 if (m_videoFullscreenModel) 942 m_videoFullscreenModel->setVideoLayerFrame(videoRect); 943 944 // This method has been deprecated so ignore the warning until we port our code to the new API. 945 #pragma clang diagnostic push 946 #pragma clang diagnostic ignored "-Wdeprecated-declarations" 947 m_playerViewController = adoptNS([allocAVPlayerViewControllerInstance() initWithVideoLayer:m_videoLayerContainer.get()]); 948 #pragma clang diagnostic pop 1052 m_playerLayerView = adoptNS([[getWebAVPlayerLayerViewClass() alloc] init]); 1053 [m_playerLayerView setHidden:[m_playerController isExternalPlaybackActive]]; 1054 [m_playerLayerView setBackgroundColor:[getUIColorClass() clearColor]]; 1055 1056 [m_playerLayerView setVideoView:&videoView]; 1057 [m_playerLayerView addSubview:&videoView]; 1058 1059 WebAVPlayerLayer *playerLayer = (WebAVPlayerLayer *)[m_playerLayerView playerLayer]; 1060 1061 [playerLayer setModelVideoLayerFrame:CGRectMake(0, 0, initialRect.width(), initialRect.height())]; 1062 [playerLayer setVideoDimensions:[m_playerController contentDimensions]]; 1063 1064 m_playerViewController = adoptNS([allocAVPlayerViewControllerInstance() initWithPlayerLayerView:m_playerLayerView.get()]); 949 1065 950 1066 [m_playerViewController setShowsPlaybackControls:NO]; … … 953 1069 [m_playerViewController setAllowsPictureInPicturePlayback:m_allowsPictureInPicturePlayback]; 954 1070 955 [m_videoLayerContainer setPlayerViewController:m_playerViewController.get()];956 957 1071 if (m_viewController) { 958 1072 [m_viewController addChildViewController:m_playerViewController.get()]; 959 1073 [[m_viewController view] addSubview:[m_playerViewController view]]; 960 1074 } else 961 [parentView .windowaddSubview:[m_playerViewController view]];962 963 [m_playerViewController view].frame = [parentView convertRect:initialRect toView: nil];1075 [parentView addSubview:[m_playerViewController view]]; 1076 1077 [m_playerViewController view].frame = [parentView convertRect:initialRect toView:[m_playerViewController view].superview]; 964 1078 965 1079 [[m_playerViewController view] setBackgroundColor:[getUIColorClass() clearColor]]; 1080 [[m_playerViewController view] setAutoresizingMask:(UIViewAutoresizingFlexibleBottomMargin | UIViewAutoresizingFlexibleRightMargin)]; 1081 966 1082 [[m_playerViewController view] setNeedsLayout]; 967 1083 [[m_playerViewController view] layoutIfNeeded]; … … 969 1085 [CATransaction commit]; 970 1086 971 if (m_fullscreenChangeObserver) 972 m_fullscreenChangeObserver->didSetupFullscreen(); 1087 RefPtr<WebVideoFullscreenInterfaceAVKit> strongThis(this); 1088 dispatch_async(dispatch_get_main_queue(), [strongThis, this] { 1089 if (m_fullscreenChangeObserver) 1090 m_fullscreenChangeObserver->didSetupFullscreen(); 1091 }); 973 1092 } 974 1093 … … 981 1100 m_enterRequested = true; 982 1101 983 [m_ videoLayerContainer setBackgroundColor:[[getUIColorClass() blackColor] CGColor]];1102 [m_playerLayerView setBackgroundColor:[getUIColorClass() blackColor]]; 984 1103 if (mode() == HTMLMediaElementEnums::VideoFullscreenModePictureInPicture) 985 1104 enterPictureInPicture(); … … 1025 1144 LOG(Fullscreen, "WebVideoFullscreenInterfaceAVKit::exitFullscreen(%p)", this); 1026 1145 [m_playerViewController setShowsPlaybackControls:NO]; 1027 if (m_viewController) 1028 [m_playerViewController view].frame = [m_parentView convertRect:finalRect toView:nil]; 1029 else 1030 [m_playerViewController view].frame = finalRect; 1031 1032 if ([m_videoLayerContainer videoLayerGravity] != AVVideoLayerGravityResizeAspect) 1033 [m_videoLayerContainer setVideoLayerGravity:AVVideoLayerGravityResizeAspect]; 1146 1147 [m_playerViewController view].frame = [m_parentView convertRect:finalRect toView:[m_playerViewController view].superview]; 1148 1149 WebAVPlayerLayer *playerLayer = (WebAVPlayerLayer *)[m_playerLayerView playerLayer]; 1150 if ([playerLayer videoGravity] != getAVLayerVideoGravityResizeAspect()) 1151 [playerLayer setVideoGravity:getAVLayerVideoGravityResizeAspect()]; 1034 1152 [[m_playerViewController view] layoutIfNeeded]; 1035 1153 … … 1050 1168 [CATransaction begin]; 1051 1169 [CATransaction setDisableActions:YES]; 1052 [m_ videoLayerContainer setBackgroundColor:[[getUIColorClass() clearColor] CGColor]];1170 [m_playerLayerView setBackgroundColor:[getUIColorClass() clearColor]]; 1053 1171 [[m_playerViewController view] setBackgroundColor:[getUIColorClass() clearColor]]; 1054 1172 [CATransaction commit]; 1055 1173 1056 if (m_fullscreenChangeObserver) 1057 m_fullscreenChangeObserver->didExitFullscreen(); 1174 dispatch_async(dispatch_get_main_queue(), ^{ 1175 if (m_fullscreenChangeObserver) 1176 m_fullscreenChangeObserver->didExitFullscreen(); 1177 }); 1058 1178 }]; 1059 1179 }; … … 1061 1181 1062 1182 @interface UIApplication () 1063 - (void)_setStatusBarOrientation:(UIInterfaceOrientation)o;1183 - (void)_setStatusBarOrientation:(UIInterfaceOrientation)o; 1064 1184 @end 1065 1185 1066 1186 @interface UIWindow () 1067 - (UIInterfaceOrientation)interfaceOrientation;1187 - (UIInterfaceOrientation)interfaceOrientation; 1068 1188 @end 1069 1189 … … 1093 1213 [m_playerViewController removeFromParentViewController]; 1094 1214 1095 [m_videoLayer removeFromSuperlayer]; 1096 [m_videoLayerContainer removeFromSuperlayer]; 1097 [m_videoLayerContainer setPlayerViewController:nil]; 1215 [m_playerLayerView removeFromSuperview]; 1098 1216 [[m_viewController view] removeFromSuperview]; 1099 1217 1100 [m_layerHostWrapper setModel:nullptr]; 1101 1102 m_layerHostWrapper = nil; 1103 m_videoLayer = nil; 1104 m_videoLayerContainer = nil; 1218 m_playerLayerView = nil; 1105 1219 m_playerViewController = nil; 1106 1220 m_playerController = nil; … … 1148 1262 if (m_prepareToInlineCallback) { 1149 1263 1150 [m_playerViewController view].frame = [m_parentView convertRect:inlineRect toView: nil];1264 [m_playerViewController view].frame = [m_parentView convertRect:inlineRect toView:[m_playerViewController view].superview]; 1151 1265 1152 1266 std::function<void(bool)> callback = WTF::move(m_prepareToInlineCallback); … … 1219 1333 m_exitCompleted = true; 1220 1334 1221 [m_ videoLayerContainer setBackgroundColor:[[getUIColorClass() clearColor] CGColor]];1335 [m_playerLayerView setBackgroundColor:[getUIColorClass() clearColor]]; 1222 1336 [[m_playerViewController view] setBackgroundColor:[getUIColorClass() clearColor]]; 1223 1337 -
TabularUnified trunk/Source/WebCore/platform/ios/WebVideoFullscreenModel.h ¶
r184670 r187044 49 49 virtual void requestExitFullscreen() = 0; 50 50 virtual void setVideoLayerFrame(FloatRect) = 0; 51 virtual FloatRect videoLayerFrame() const = 0;52 51 enum VideoGravity { VideoGravityResize, VideoGravityResizeAspect, VideoGravityResizeAspectFill }; 53 52 virtual void setVideoLayerGravity(VideoGravity) = 0; 54 virtual VideoGravity videoLayerGravity() const = 0;55 53 virtual void selectAudioMediaOption(uint64_t index) = 0; 56 54 virtual void selectLegibleMediaOption(uint64_t index) = 0; -
TabularUnified trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelVideoElement.h ¶
r184670 r187044 73 73 WEBCORE_EXPORT virtual void requestExitFullscreen() override; 74 74 WEBCORE_EXPORT virtual void setVideoLayerFrame(FloatRect) override; 75 WEBCORE_EXPORT virtual FloatRect videoLayerFrame() const override;76 75 WEBCORE_EXPORT virtual void setVideoLayerGravity(VideoGravity) override; 77 WEBCORE_EXPORT virtual VideoGravity videoLayerGravity() const override;78 76 WEBCORE_EXPORT virtual void selectAudioMediaOption(uint64_t index) override; 79 77 WEBCORE_EXPORT virtual void selectLegibleMediaOption(uint64_t index) override; -
TabularUnified trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelVideoElement.mm ¶
r185726 r187044 255 255 } 256 256 257 FloatRect WebVideoFullscreenModelVideoElement::videoLayerFrame() const258 {259 return m_videoFrame;260 }261 262 257 void WebVideoFullscreenModelVideoElement::setVideoLayerGravity(WebVideoFullscreenModel::VideoGravity gravity) 263 258 { … … 273 268 274 269 m_videoElement->setVideoFullscreenGravity(videoGravity); 275 }276 277 WebVideoFullscreenModel::VideoGravity WebVideoFullscreenModelVideoElement::videoLayerGravity() const278 {279 switch (m_videoElement->videoFullscreenGravity()) {280 case MediaPlayer::VideoGravityResize:281 return VideoGravityResize;282 case MediaPlayer::VideoGravityResizeAspect:283 return VideoGravityResizeAspect;284 case MediaPlayer::VideoGravityResizeAspectFill:285 return VideoGravityResizeAspectFill;286 }287 288 ASSERT_NOT_REACHED();289 return VideoGravityResize;290 270 } 291 271 -
TabularUnified trunk/Source/WebCore/platform/spi/cocoa/AVKitSPI.h ¶
r185834 r187044 35 35 36 36 #import <AVKit/AVPlayerController.h> 37 #pragma clang diagnostic push 38 #pragma clang diagnostic ignored "-Wobjc-property-no-attribute" 39 #import <AVKit/AVPlayerLayerView.h> 40 #pragma clang diagnostic pop 37 41 #import <AVKit/AVPlayerViewController_Private.h> 38 42 #import <AVKit/AVPlayerViewController_WebKitOnly.h> 39 #import <AVKit/AVVideoLayer.h>40 43 41 44 #else … … 59 62 @end 60 63 61 @ protocol AVVideoLayer62 typedef NS_ENUM(NSInteger, AVVideoLayerGravity) { 63 AVVideoLayerGravityInvalid = 0, 64 AVVideoLayerGravityResizeAspect = 1, 65 AVVideoLayerGravityResizeAspectFill = 2, 66 AVVideoLayerGravityResize = 3, 67 }; 68 - (void)setPlayerController:(AVPlayerController *)playerController;69 @property (nonatomic ) AVVideoLayerGravity videoLayerGravity;70 @property (nonatomic) CGRect videoRect;71 @property (nonatomic, readonly, getter=isReadyForDisplay) BOOL readyForDisplay;64 @class AVPlayerLayer; 65 66 @interface AVPictureInPicturePlayerLayerView : UIView 67 @property (nonatomic, readonly) AVPlayerLayer *playerLayer; 68 @end 69 70 @interface AVPlayerLayerView : UIView 71 @property (nonatomic, readonly) AVPlayerLayer *playerLayer; 72 @property (nonatomic, readonly) AVPictureInPicturePlayerLayerView *pictureInPicturePlayerLayerView; 73 - (void)startRoutingVideoToPictureInPicturePlayerLayerView; 74 - (void)stopRoutingVideoToPictureInPicturePlayerLayerView; 72 75 @end 73 76 … … 86 89 87 90 @interface AVPlayerViewController (Details) 88 - (instancetype)initWith VideoLayer:(CALayer <AVVideoLayer> *)videoLayer;91 - (instancetype)initWithPlayerLayerView:(AVPlayerLayerView *)playerLayerView; 89 92 - (void)enterFullScreenAnimated:(BOOL)animated completionHandler:(void (^)(BOOL success, NSError *))completionHandler; 90 93 - (void)exitFullScreenAnimated:(BOOL)animated completionHandler:(void (^)(BOOL success, NSError *))completionHandler; … … 93 96 - (void)startPictureInPicture; 94 97 - (void)stopPictureInPicture; 95 - (void)setAllowsPictureInPicturePlayback:(BOOL)allow;96 98 99 @property (nonatomic) BOOL allowsPictureInPicturePlayback; 97 100 @property (nonatomic, strong) AVPlayerController *playerController; 98 101 @property (nonatomic, weak) id <AVPlayerViewControllerDelegate> delegate; -
TabularUnified trunk/Source/WebCore/platform/spi/cocoa/QuartzCoreSPI.h ¶
r186879 r187044 33 33 34 34 #ifdef __OBJC__ 35 #import <QuartzCore/CALayerHost.h> 35 36 #import <QuartzCore/CALayerPrivate.h> 36 37 … … 135 136 @end 136 137 #endif 138 139 @interface CALayerHost : CALayer 140 @property uint32_t contextId; 141 @property BOOL inheritsSecurity; 142 @end 143 137 144 #endif // __OBJC__ 138 145 -
TabularUnified trunk/Source/WebKit2/ChangeLog ¶
r187039 r187044 1 2015-07-20 Jeremy Jones <jeremyj@apple.com> 2 3 Adopt AVPlayerLayerView 4 https://bugs.webkit.org/show_bug.cgi?id=146862 5 6 Reviewed by Simon Fraser. 7 8 The CALayerHost is replaced with WebLayerHostView to be compatible with UIView animations. 9 videoLayerFrame and videoLayerGravity no longer need to be stored because they are stored 10 where they are used in the interface. Some animation is improved in the conversion. 11 12 * UIProcess/ios/WebVideoFullscreenManagerProxy.h: 13 * UIProcess/ios/WebVideoFullscreenManagerProxy.mm: 14 (+[WebLayerHostView layerClass]): Add class WebLayerHostView. 15 (-[WebLayerHostView contextID]): 16 (-[WebLayerHostView setContextID:]): 17 (-[WebLayerHostView layerHost]): 18 (WebKit::WebVideoFullscreenManagerProxy::invalidate): layer -> view 19 (WebKit::WebVideoFullscreenManagerProxy::setupFullscreenWithID): 20 Apply the hostingDeviceScaleFactor transform to -sublayerTransform instead of to 21 -transform. This more directly inverts the tranform WebProcess and allows -transform 22 to be used for animation in the UIProcess. This is important because UIView's actions 23 animate -transform, but not -sublayerTrasform. 24 25 (WebKit::WebVideoFullscreenManagerProxy::didCleanupFullscreen): layer -> view 26 (WebKit::WebVideoFullscreenModelContext::setVideoLayerFrame): Deleted. 27 (WebKit::WebVideoFullscreenModelContext::videoLayerFrame): Deleted. 28 (WebKit::WebVideoFullscreenModelContext::setVideoLayerGravity): Deleted. 29 (WebKit::WebVideoFullscreenModelContext::videoLayerGravity): Deleted. 30 * WebProcess/ios/WebVideoFullscreenManager.mm: 31 (WebKit::WebVideoFullscreenManager::enterVideoFullscreenForVideoElement): 32 Set initial video layer frame to fix start point of animation. 33 34 (WebKit::WebVideoFullscreenManager::didSetupFullscreen): 35 dispatch_async allows the CATransaction to complete before continuing with the animation. 36 This prevents a flash during animation. 37 1 38 2015-07-20 Tim Horton <timothy_horton@apple.com> 2 39 -
TabularUnified trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.h ¶
r186067 r187044 54 54 void invalidate() { m_manager = nullptr; } 55 55 56 PlatformLayer* layerHost() const { return m_layerHost.get(); } 57 void setLayerHost(RetainPtr<PlatformLayer>&& layerHost) { m_layerHost = WTF::move(layerHost); } 58 59 void setInitialVideoLayerFrame(WebCore::FloatRect frame) { m_videoLayerFrame = frame; } 56 UIView *layerHostView() const { return m_layerHostView.get(); } 57 void setLayerHostView(RetainPtr<UIView>&& layerHostView) { m_layerHostView = WTF::move(layerHostView); } 60 58 61 59 private: … … 79 77 virtual void requestExitFullscreen() override; 80 78 virtual void setVideoLayerFrame(WebCore::FloatRect) override; 81 virtual WebCore::FloatRect videoLayerFrame() const override;82 79 virtual void setVideoLayerGravity(VideoGravity) override; 83 virtual VideoGravity videoLayerGravity() const override;84 80 virtual void selectAudioMediaOption(uint64_t) override; 85 81 virtual void selectLegibleMediaOption(uint64_t) override; … … 95 91 WebVideoFullscreenManagerProxy* m_manager; 96 92 uint64_t m_contextId; 97 RetainPtr<PlatformLayer> m_layerHost; 98 WebCore::FloatRect m_videoLayerFrame; 99 VideoGravity m_videoLayerGravity { VideoGravityResize }; 93 RetainPtr<UIView *> m_layerHostView; 100 94 }; 101 95 -
TabularUnified trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm ¶
r186067 r187044 36 36 #import "WebVideoFullscreenManagerProxyMessages.h" 37 37 #import <QuartzCore/CoreAnimation.h> 38 #import <WebCore/QuartzCoreSPI.h> 38 39 #import <WebCore/TimeRanges.h> 39 40 #import <WebKitSystemInterface.h> 40 41 42 @interface WebLayerHostView : UIView 43 @property (nonatomic, assign) uint32_t contextID; 44 @end 45 46 @implementation WebLayerHostView 47 48 + (Class)layerClass { 49 return [CALayerHost class]; 50 } 51 52 - (uint32_t)contextID { 53 return [[self layerHost] contextId]; 54 } 55 56 - (void)setContextID:(uint32_t)contextID { 57 [[self layerHost] setContextId:contextID]; 58 } 59 60 - (CALayerHost *)layerHost { 61 return (CALayerHost *)[self layer]; 62 } 63 64 @end 65 41 66 using namespace WebCore; 42 67 … … 140 165 void WebVideoFullscreenModelContext::setVideoLayerFrame(WebCore::FloatRect frame) 141 166 { 142 m_videoLayerFrame = frame;143 167 if (m_manager) 144 168 m_manager->setVideoLayerFrame(m_contextId, frame); 145 169 } 146 170 147 WebCore::FloatRect WebVideoFullscreenModelContext::videoLayerFrame() const148 {149 return m_videoLayerFrame;150 }151 152 171 void WebVideoFullscreenModelContext::setVideoLayerGravity(WebCore::WebVideoFullscreenModel::VideoGravity gravity) 153 172 { 154 m_videoLayerGravity = gravity;155 173 if (m_manager) 156 174 m_manager->setVideoLayerGravity(m_contextId, gravity); 157 }158 159 WebCore::WebVideoFullscreenModel::VideoGravity WebVideoFullscreenModelContext::videoLayerGravity() const160 {161 return m_videoLayerGravity;162 175 } 163 176 … … 241 254 242 255 interface->invalidate(); 243 [model->layerHost () removeFromSuperlayer];244 model->setLayerHost (nullptr);256 [model->layerHostView() removeFromSuperview]; 257 model->setLayerHostView(nullptr); 245 258 } 246 259 … … 311 324 std::tie(model, interface) = ensureModelAndInterface(contextId); 312 325 313 model->setInitialVideoLayerFrame(initialRect); 314 model->setLayerHost(WKMakeRenderLayer(videoLayerID)); 326 RetainPtr<WebLayerHostView> view = adoptNS([[WebLayerHostView alloc] init]); 327 [view setContextID:videoLayerID]; 328 model->setLayerHostView(view); 315 329 if (hostingDeviceScaleFactor != 1) { 316 330 // Invert the scale transform added in the WebProcess to fix <rdar://problem/18316542>. 317 331 float inverseScale = 1 / hostingDeviceScaleFactor; 318 [ model->layerHost() setTransform:CATransform3DMakeScale(inverseScale, inverseScale, 1)];332 [[model->layerHostView() layer] setSublayerTransform:CATransform3DMakeScale(inverseScale, inverseScale, 1)]; 319 333 } 320 334 321 335 UIView *parentView = downcast<RemoteLayerTreeDrawingAreaProxy>(*m_page->drawingArea()).remoteLayerTreeHost().rootLayer(); 322 interface->setupFullscreen(*model->layerHost (), initialRect, parentView, videoFullscreenMode, allowsPictureInPicture);336 interface->setupFullscreen(*model->layerHostView(), initialRect, parentView, videoFullscreenMode, allowsPictureInPicture); 323 337 } 324 338 … … 503 517 504 518 [CATransaction flush]; 505 [model.layerHost () removeFromSuperlayer];506 model.setLayerHost (nullptr);519 [model.layerHostView() removeFromSuperview]; 520 model.setLayerHostView(nullptr); 507 521 m_page->send(Messages::WebVideoFullscreenManager::DidCleanupFullscreen(contextId), m_page->pageID()); 508 522 -
TabularUnified trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm ¶
r186566 r187044 233 233 std::tie(model, interface) = ensureModelAndInterface(contextId); 234 234 235 FloatRect clientRect = clientRectForElement(&videoElement); 236 FloatRect videoLayerFrame = FloatRect(0, 0, clientRect.width(), clientRect.height()); 237 235 238 interface->setTargetIsFullscreen(true); 236 239 interface->setFullscreenMode(mode); 237 240 model->setVideoElement(&videoElement); 241 model->setVideoLayerFrame(videoLayerFrame); 238 242 239 243 if (interface->isAnimating()) … … 429 433 [CATransaction commit]; 430 434 431 m_page->send(Messages::WebVideoFullscreenManagerProxy::EnterFullscreen(contextId), m_page->pageID()); 435 RefPtr<WebVideoFullscreenManager> strongThis(this); 436 dispatch_async(dispatch_get_main_queue(), [strongThis, this, contextId] { 437 m_page->send(Messages::WebVideoFullscreenManagerProxy::EnterFullscreen(contextId), m_page->pageID()); 438 }); 432 439 } 433 440
Note:
See TracChangeset
for help on using the changeset viewer.