Title: [151608] trunk/Source
Revision
151608
Author
jer.no...@apple.com
Date
2013-06-14 15:27:35 -0700 (Fri, 14 Jun 2013)

Log Message

Add support for AVFoundation-backed HTMLMediaElements in the WebVideoFullScreenController.
https://bugs.webkit.org/show_bug.cgi?id=117597

Reviewed by Eric Carlson.

Source/WebCore:

Check for media elements with AVFoundation media types and create a AVPlayerLayer
rather than a QTMovieLayer.

* platform/mac/WebVideoFullscreenController.h:
* platform/mac/WebVideoFullscreenController.mm:
(-[WebVideoFullscreenController setupVideoOverlay:]): Take a CALayer rather than a
    QTMovieLayer. Move the code which connects the layer with it's media source into
    setMediaElement.
(-[WebVideoFullscreenController windowDidLoad]): Give the window's contentView a generic
    CALayer instaead of a QTMovieLayer.
(-[WebVideoFullscreenController setMediaElement:]): Test whether the incoming media
    element is backed by a QTMovie or an AVPlayer, and create the appropriate layer.
(-[WebVideoFullscreenController windowDidExitFullscreen]): Remove the observer of
    AVPlayer's rate property.
(-[WebVideoFullscreenController observeValueForKeyPath:ofObject:change:context:]):
    If the keyPath is "rate", call rateChanged.

Source/WebKit/mac:

Allow AVFoundation to be enabled even when the FullScreen API is disabled.

* WebView/WebView.mm:
(-[WebView _preferencesChanged:]):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (151607 => 151608)


--- trunk/Source/WebCore/ChangeLog	2013-06-14 22:21:13 UTC (rev 151607)
+++ trunk/Source/WebCore/ChangeLog	2013-06-14 22:27:35 UTC (rev 151608)
@@ -1,3 +1,27 @@
+2013-06-13  Jer Noble  <jer.no...@apple.com>
+
+        Add support for AVFoundation-backed HTMLMediaElements in the WebVideoFullScreenController.
+        https://bugs.webkit.org/show_bug.cgi?id=117597
+
+        Reviewed by Eric Carlson.
+
+        Check for media elements with AVFoundation media types and create a AVPlayerLayer
+        rather than a QTMovieLayer.
+
+        * platform/mac/WebVideoFullscreenController.h:
+        * platform/mac/WebVideoFullscreenController.mm:
+        (-[WebVideoFullscreenController setupVideoOverlay:]): Take a CALayer rather than a
+            QTMovieLayer. Move the code which connects the layer with it's media source into
+            setMediaElement.
+        (-[WebVideoFullscreenController windowDidLoad]): Give the window's contentView a generic
+            CALayer instaead of a QTMovieLayer.
+        (-[WebVideoFullscreenController setMediaElement:]): Test whether the incoming media 
+            element is backed by a QTMovie or an AVPlayer, and create the appropriate layer.
+        (-[WebVideoFullscreenController windowDidExitFullscreen]): Remove the observer of
+            AVPlayer's rate property.
+        (-[WebVideoFullscreenController observeValueForKeyPath:ofObject:change:context:]):
+            If the keyPath is "rate", call rateChanged.
+
 2013-06-14  Enrica Casucci  <enr...@apple.com>
 
         WKPageFindStringMatches ignores the kWKFindOptionsBackwards option.

Modified: trunk/Source/WebCore/platform/mac/WebVideoFullscreenController.h (151607 => 151608)


--- trunk/Source/WebCore/platform/mac/WebVideoFullscreenController.h	2013-06-14 22:21:13 UTC (rev 151607)
+++ trunk/Source/WebCore/platform/mac/WebVideoFullscreenController.h	2013-06-14 22:27:35 UTC (rev 151608)
@@ -38,7 +38,7 @@
 @protocol WebVideoFullscreenControllerDelegate;
 @class WebVideoFullscreenHUDWindowController;
 @class WebWindowFadeAnimation;
-@class QTMovieLayer;
+@class CALayer;
 
 @interface WebVideoFullscreenController : NSWindowController {
 @private
@@ -59,7 +59,7 @@
 - (id <WebVideoFullscreenControllerDelegate>)delegate;
 - (void)setDelegate:(id <WebVideoFullscreenControllerDelegate>)delegate;
 
-- (void)setupVideoOverlay:(QTMovieLayer*)layer;
+- (void)setupVideoOverlay:(CALayer*)layer;
 - (void)setMediaElement:(WebCore::HTMLMediaElement*)mediaElement;
 - (WebCore::HTMLMediaElement*)mediaElement;
 

Modified: trunk/Source/WebCore/platform/mac/WebVideoFullscreenController.mm (151607 => 151608)


--- trunk/Source/WebCore/platform/mac/WebVideoFullscreenController.mm	2013-06-14 22:21:13 UTC (rev 151607)
+++ trunk/Source/WebCore/platform/mac/WebVideoFullscreenController.mm	2013-06-14 22:27:35 UTC (rev 151608)
@@ -31,6 +31,7 @@
 
 #import "WebVideoFullscreenHUDWindowController.h"
 #import "WebWindowAnimation.h"
+#import <AVFoundation/AVFoundation.h>
 #import <Carbon/Carbon.h>
 #import <QTKit/QTKit.h>
 #import <WebCore/DisplaySleepDisabler.h>
@@ -51,6 +52,9 @@
 
 #define QTMovieRateDidChangeNotification getQTMovieRateDidChangeNotification()
 
+SOFT_LINK_FRAMEWORK(AVFoundation)
+SOFT_LINK_CLASS(AVFoundation, AVPlayerLayer)
+
 @interface WebVideoFullscreenWindow : NSWindow<NSAnimationDelegate>
 {
     SEL _controllerActionOnAnimationEnd;
@@ -95,7 +99,7 @@
     return (WebVideoFullscreenWindow *)[super window];
 }
 
-- (void)setupVideoOverlay:(QTMovieLayer*)layer
+- (void)setupVideoOverlay:(CALayer *)layer
 {
     WebVideoFullscreenWindow *window = [self fullscreenWindow];
 #if USE(GSTREAMER)
@@ -107,8 +111,6 @@
 #else
     [[window contentView] setLayer:layer];
     [[window contentView] setWantsLayer:YES];
-    if (_mediaElement && _mediaElement->platformMedia().type == PlatformMedia::QTMovieType)
-        [layer setMovie:_mediaElement->platformMedia().media.qtMovie];
 #endif
 }
 
@@ -117,11 +119,9 @@
     WebVideoFullscreenWindow *window = [self fullscreenWindow];
     [window setHasShadow:YES]; // This is nicer with a shadow.
     [window setLevel:NSPopUpMenuWindowLevel-1];
+    [[window contentView] setLayer:[CALayer layer]];
+    [[window contentView] setWantsLayer:YES];
 
-    QTMovieLayer *layer = [[getQTMovieLayerClass() alloc] init];
-    [self setupVideoOverlay:layer];
-    [layer release];
-
 #if !USE(GSTREAMER)
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidResignActive:) name:NSApplicationDidResignActiveNotification object:NSApp];
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeScreenParameters:) name:NSApplicationDidChangeScreenParametersNotification object:NSApp];
@@ -136,18 +136,32 @@
 - (void)setMediaElement:(HTMLMediaElement*)mediaElement
 {
     _mediaElement = mediaElement;
+
+    if (!_mediaElement)
+        return;
+
     if ([self isWindowLoaded]) {
-        QTMovieLayer *movieLayer = (QTMovieLayer *)[[[self fullscreenWindow] contentView] layer];
+        if (_mediaElement->platformMedia().type == PlatformMedia::QTMovieType) {
+            QTMovie *movie = _mediaElement->platformMedia().media.qtMovie;
+            QTMovieLayer *layer = [[getQTMovieLayerClass() alloc] init];
+            [layer setMovie:movie];
+            [self setupVideoOverlay:layer];
 
-        ASSERT(movieLayer && [movieLayer isKindOfClass:[getQTMovieLayerClass() class]]);
-        [self setupVideoOverlay:movieLayer];
 #if !USE(GSTREAMER)
-        ASSERT([movieLayer movie]);
-        [[NSNotificationCenter defaultCenter] addObserver:self
-                                                 selector:@selector(rateChanged:) 
-                                                     name:QTMovieRateDidChangeNotification 
-                                                   object:[movieLayer movie]];
+            [[NSNotificationCenter defaultCenter] addObserver:self
+                                                     selector:@selector(rateChanged:)
+                                                         name:QTMovieRateDidChangeNotification
+                                                       object:movie];
 #endif
+
+        } else if (_mediaElement->platformMedia().type == PlatformMedia::AVFoundationMediaPlayerType) {
+            AVPlayer *player = _mediaElement->platformMedia().media.avfMediaPlayer;
+            AVPlayerLayer *layer = [[getAVPlayerLayerClass() alloc] init];
+            [self setupVideoOverlay:layer];
+            [layer setPlayer:player];
+
+            [player addObserver:self forKeyPath:@"rate" options:nil context:NULL];
+        }
     }
 }
 
@@ -177,6 +191,10 @@
     if (_mediaElement && _mediaElement->platformMedia().type == PlatformMedia::GStreamerGWorldType)
         _mediaElement->platformMedia().media.gstreamerGWorld->exitFullscreen();
 #endif
+    CALayer *layer = [[[self window] contentView] layer];
+    if ([layer isKindOfClass:getAVPlayerLayerClass()])
+        [[(AVPlayerLayer*)layer player] removeObserver:self forKeyPath:@"rate"];
+
     [self clearFadeAnimation];
     [[self window] close];
     [self setWindow:nil];
@@ -400,9 +418,16 @@
     [_hudController fadeWindowIn];
 }
 
-// MARK: -
-// MARK: QTMovie callbacks
+- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
+{
+    UNUSED_PARAM(object);
+    UNUSED_PARAM(change);
+    UNUSED_PARAM(context);
 
+    if ([keyPath isEqualTo:@"rate"])
+        [self rateChanged:nil];
+}
+
 - (void)rateChanged:(NSNotification *)unusedNotification
 {
     UNUSED_PARAM(unusedNotification);

Modified: trunk/Source/WebKit/mac/ChangeLog (151607 => 151608)


--- trunk/Source/WebKit/mac/ChangeLog	2013-06-14 22:21:13 UTC (rev 151607)
+++ trunk/Source/WebKit/mac/ChangeLog	2013-06-14 22:27:35 UTC (rev 151608)
@@ -1,3 +1,15 @@
+2013-06-13  Jer Noble  <jer.no...@apple.com>
+
+        Add support for AVFoundation-backed HTMLMediaElements in the WebVideoFullScreenController.
+        https://bugs.webkit.org/show_bug.cgi?id=117597
+
+        Reviewed by Eric Carlson.
+
+        Allow AVFoundation to be enabled even when the FullScreen API is disabled.
+
+        * WebView/WebView.mm:
+        (-[WebView _preferencesChanged:]): 
+
 2013-06-12  Anders Carlsson  <ander...@apple.com>
 
         Remove the notion of inactive plug-ins

Modified: trunk/Source/WebKit/mac/WebView/WebView.mm (151607 => 151608)


--- trunk/Source/WebKit/mac/WebView/WebView.mm	2013-06-14 22:21:13 UTC (rev 151607)
+++ trunk/Source/WebKit/mac/WebView/WebView.mm	2013-06-14 22:27:35 UTC (rev 151608)
@@ -1523,12 +1523,8 @@
     settings->setInteractiveFormValidationEnabled([self interactiveFormValidationEnabled]);
     settings->setValidationMessageTimerMagnification([self validationMessageTimerMagnification]);
 #if USE(AVFOUNDATION)
-#if ENABLE(FULLSCREEN_API)
-    settings->setAVFoundationEnabled([preferences isAVFoundationEnabled] && [preferences fullScreenEnabled]);
-#else
-    settings->setAVFoundationEnabled(false);
+    settings->setAVFoundationEnabled([preferences isAVFoundationEnabled]);
 #endif
-#endif
 #if PLATFORM(MAC) || (PLATFORM(QT) && USE(QTKIT))
     settings->setQTKitEnabled([preferences isQTKitEnabled]);
 #endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to