Title: [168341] trunk/Source
Revision
168341
Author
[email protected]
Date
2014-05-05 18:49:29 -0700 (Mon, 05 May 2014)

Log Message

Implement scan backward and forward in video fullscreen.
https://bugs.webkit.org/show_bug.cgi?id=132517

Patch by Jeremy Jones <[email protected]> on 2014-05-05
Reviewed by Simon Fraser.

Source/WebCore:
Implement scanning forward and backward. This implements methods in
WebAVPlayerController and forwards them through WebVideoFullscreenModelMediaElement
and on to HTMLMediaElement.

* WebCore.exp.in: necessary exports.
* platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
(-[WebAVPlayerController seekToTime:]):
Use fastSeek in this case.
(-[WebAVPlayerController canScanForward]): If you can play, you can scan.
(+[WebAVPlayerController keyPathsForValuesAffectingCanScanForward]): ditto
(-[WebAVPlayerController beginScanningForward:]): ditto
(-[WebAVPlayerController endScanningForward:]): ditto
(-[WebAVPlayerController canScanBackward]): If you can play, you can scan.
(+[WebAVPlayerController keyPathsForValuesAffectingCanScanBackward]): ditto
(-[WebAVPlayerController beginScanningBackward:]): ditto
(-[WebAVPlayerController endScanningBackward:]): ditto
(-[WebAVPlayerController canSeekToBeginning]):
This looks at seekableRanges to determine if any seeking is possible.
(+[WebAVPlayerController keyPathsForValuesAffectingCanSeekToBeginning]):
depends on seekableRanges.
(-[WebAVPlayerController seekToBeginning:]): seek to -ininity
(-[WebAVPlayerController canSeekToEnd]):
This looks at seekableRanges to determine if any seeking is possible.
(+[WebAVPlayerController keyPathsForValuesAffectingCanSeekToEnd]):
depends on seekableRanges.
(-[WebAVPlayerController seekToEnd:]): seek to INFINITY.
* platform/ios/WebVideoFullscreenModel.h:
Add 4 new functions.
* platform/ios/WebVideoFullscreenModelMediaElement.h:
ditto
* platform/ios/WebVideoFullscreenModelMediaElement.mm:
(WebVideoFullscreenModelMediaElement::fastSeek): forwards to HTMLMediaEelement
(WebVideoFullscreenModelMediaElement::beginScanningForward): forwards to HTMLMediaEelement
(WebVideoFullscreenModelMediaElement::beginScanningBackward): forwards to HTMLMediaEelement
(WebVideoFullscreenModelMediaElement::endScanning): forwards to HTMLMediaEelement

Source/WebKit2:
Plumb through scanning/seeking functions.

* UIProcess/ios/WebVideoFullscreenManagerProxy.h:
* UIProcess/ios/WebVideoFullscreenManagerProxy.mm:
(WebKit::WebVideoFullscreenManagerProxy::fastSeek):
(WebKit::WebVideoFullscreenManagerProxy::beginScanningForward):
(WebKit::WebVideoFullscreenManagerProxy::beginScanningBackward):
(WebKit::WebVideoFullscreenManagerProxy::endScanning):
* WebProcess/ios/WebVideoFullscreenManager.messages.in:

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (168340 => 168341)


--- trunk/Source/WebCore/ChangeLog	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebCore/ChangeLog	2014-05-06 01:49:29 UTC (rev 168341)
@@ -1,3 +1,46 @@
+2014-05-05  Jeremy Jones  <[email protected]>
+
+        Implement scan backward and forward in video fullscreen.
+        https://bugs.webkit.org/show_bug.cgi?id=132517
+
+        Reviewed by Simon Fraser.
+
+        Implement scanning forward and backward. This implements methods in 
+        WebAVPlayerController and forwards them through WebVideoFullscreenModelMediaElement
+        and on to HTMLMediaElement.
+
+        * WebCore.exp.in: necessary exports.
+        * platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
+        (-[WebAVPlayerController seekToTime:]):
+        Use fastSeek in this case.
+        (-[WebAVPlayerController canScanForward]): If you can play, you can scan.
+        (+[WebAVPlayerController keyPathsForValuesAffectingCanScanForward]): ditto
+        (-[WebAVPlayerController beginScanningForward:]): ditto
+        (-[WebAVPlayerController endScanningForward:]): ditto
+        (-[WebAVPlayerController canScanBackward]): If you can play, you can scan.
+        (+[WebAVPlayerController keyPathsForValuesAffectingCanScanBackward]): ditto
+        (-[WebAVPlayerController beginScanningBackward:]): ditto
+        (-[WebAVPlayerController endScanningBackward:]): ditto
+        (-[WebAVPlayerController canSeekToBeginning]):
+        This looks at seekableRanges to determine if any seeking is possible.
+        (+[WebAVPlayerController keyPathsForValuesAffectingCanSeekToBeginning]):
+        depends on seekableRanges.
+        (-[WebAVPlayerController seekToBeginning:]): seek to -ininity
+        (-[WebAVPlayerController canSeekToEnd]):
+        This looks at seekableRanges to determine if any seeking is possible.
+        (+[WebAVPlayerController keyPathsForValuesAffectingCanSeekToEnd]):
+        depends on seekableRanges.
+        (-[WebAVPlayerController seekToEnd:]): seek to INFINITY.
+        * platform/ios/WebVideoFullscreenModel.h:
+        Add 4 new functions.
+        * platform/ios/WebVideoFullscreenModelMediaElement.h:
+        ditto
+        * platform/ios/WebVideoFullscreenModelMediaElement.mm:
+        (WebVideoFullscreenModelMediaElement::fastSeek): forwards to HTMLMediaEelement
+        (WebVideoFullscreenModelMediaElement::beginScanningForward): forwards to HTMLMediaEelement
+        (WebVideoFullscreenModelMediaElement::beginScanningBackward): forwards to HTMLMediaEelement
+        (WebVideoFullscreenModelMediaElement::endScanning): forwards to HTMLMediaEelement
+
 2014-05-05  Benjamin Poulain  <[email protected]>
 
         [iOS][WK2] Prefetch DNS hostnames on tap highlight

Modified: trunk/Source/WebCore/WebCore.exp.in (168340 => 168341)


--- trunk/Source/WebCore/WebCore.exp.in	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebCore/WebCore.exp.in	2014-05-06 01:49:29 UTC (rev 168341)
@@ -3292,19 +3292,23 @@
 
 #if ENABLE(VIDEO) && PLATFORM(IOS)
 __ZN7WebCore35WebVideoFullscreenModelMediaElement10seekToTimeEd
+__ZN7WebCore35WebVideoFullscreenModelMediaElement11endScanningEv
 __ZN7WebCore35WebVideoFullscreenModelMediaElement11handleEventEPNS_22ScriptExecutionContextEPNS_5EventE
 __ZN7WebCore35WebVideoFullscreenModelMediaElement12endScrubbingEv
 __ZN7WebCore35WebVideoFullscreenModelMediaElement14beginScrubbingEv
 __ZN7WebCore35WebVideoFullscreenModelMediaElement15setMediaElementEPNS_16HTMLMediaElementE
 __ZN7WebCore35WebVideoFullscreenModelMediaElement15togglePlayStateEv
 __ZN7WebCore35WebVideoFullscreenModelMediaElement18setVideoLayerFrameENS_9FloatRectE
+__ZN7WebCore35WebVideoFullscreenModelMediaElement20beginScanningForwardEv
 __ZN7WebCore35WebVideoFullscreenModelMediaElement20setVideoLayerGravityENS_23WebVideoFullscreenModel12VideoGravityE
+__ZN7WebCore35WebVideoFullscreenModelMediaElement21beginScanningBackwardEv
 __ZN7WebCore35WebVideoFullscreenModelMediaElement21requestExitFullscreenEv
 __ZN7WebCore35WebVideoFullscreenModelMediaElement22selectAudioMediaOptionEy
 __ZN7WebCore35WebVideoFullscreenModelMediaElement23setVideoFullscreenLayerEP7CALayer
 __ZN7WebCore35WebVideoFullscreenModelMediaElement24selectLegibleMediaOptionEy
 __ZN7WebCore35WebVideoFullscreenModelMediaElement4playEv
 __ZN7WebCore35WebVideoFullscreenModelMediaElement5pauseEv
+__ZN7WebCore35WebVideoFullscreenModelMediaElement8fastSeekEd
 __ZN7WebCore35WebVideoFullscreenModelMediaElementC2Ev
 __ZN7WebCore35WebVideoFullscreenModelMediaElementD2Ev
 __ZNK7WebCore16HTMLVideoElement10videoWidthEv

Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm (168340 => 168341)


--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm	2014-05-06 01:49:29 UTC (rev 168341)
@@ -72,7 +72,12 @@
 SOFT_LINK(CoreMedia, CMTimeRangeGetEnd, CMTime, (CMTimeRange range), (range))
 SOFT_LINK(CoreMedia, CMTimeRangeMake, CMTimeRange, (CMTime start, CMTime duration), (start, duration))
 SOFT_LINK(CoreMedia, CMTimeSubtract, CMTime, (CMTime minuend, CMTime subtrahend), (minuend, subtrahend))
+SOFT_LINK(CoreMedia, CMTimeMaximum, CMTime, (CMTime time1, CMTime time2), (time1, time2))
+SOFT_LINK(CoreMedia, CMTimeMinimum, CMTime, (CMTime time1, CMTime time2), (time1, time2))
+SOFT_LINK_CONSTANT(CoreMedia, kCMTimeIndefinite, CMTime)
 
+#define kCMTimeIndefinite getkCMTimeIndefinite()
+
 @class WebAVMediaSelectionOption;
 
 @interface WebAVPlayerController : NSObject <AVPlayerViewControllerDelegate>
@@ -84,6 +89,11 @@
 @property(retain) AVPlayerController* playerControllerProxy;
 @property(assign) WebVideoFullscreenModel* delegate;
 
+@property (readonly) BOOL canScanForward;
+@property (readonly) BOOL canScanBackward;
+@property (readonly) BOOL canSeekToBeginning;
+@property (readonly) BOOL canSeekToEnd;
+
 @property BOOL canPlay;
 @property(getter=isPlaying) BOOL playing;
 @property BOOL canPause;
@@ -212,7 +222,7 @@
 - (void)seekToTime:(NSTimeInterval)time
 {
     ASSERT(self.delegate);
-    self.delegate->seekToTime(time);
+    self.delegate->fastSeek(time);
 }
 
 - (BOOL)hasLiveStreamingContent
@@ -261,6 +271,100 @@
         [self seekToTime:timeAtEndOfSeekableTimeRanges];
 }
 
+- (BOOL)canScanForward
+{
+    return [self canPlay];
+}
+
++ (NSSet *)keyPathsForValuesAffectingCanScanForward
+{
+    return [NSSet setWithObject:@"canPlay"];
+}
+
+- (void)beginScanningForward:(id)sender
+{
+    UNUSED_PARAM(sender);
+    ASSERT(self.delegate);
+    self.delegate->beginScanningForward();
+}
+
+- (void)endScanningForward:(id)sender
+{
+    UNUSED_PARAM(sender);
+    ASSERT(self.delegate);
+    self.delegate->endScanning();
+}
+
+- (BOOL)canScanBackward
+{
+    return [self canPlay];
+}
+
++ (NSSet *)keyPathsForValuesAffectingCanScanBackward
+{
+    return [NSSet setWithObject:@"canPlay"];
+}
+
+- (void)beginScanningBackward:(id)sender
+{
+    UNUSED_PARAM(sender);
+    ASSERT(self.delegate);
+    self.delegate->beginScanningBackward();
+}
+
+- (void)endScanningBackward:(id)sender
+{
+    UNUSED_PARAM(sender);
+    ASSERT(self.delegate);
+    self.delegate->endScanning();
+}
+
+- (BOOL)canSeekToBeginning
+{
+    CMTime minimumTime = kCMTimeIndefinite;
+
+    for (NSValue *value in [self seekableTimeRanges])
+        minimumTime = CMTimeMinimum([value CMTimeRangeValue].start, minimumTime);
+
+    return CMTIME_IS_NUMERIC(minimumTime);
+}
+
++ (NSSet *)keyPathsForValuesAffectingCanSeekToBeginning
+{
+    return [NSSet setWithObject:@"seekableTimeRanges"];
+}
+
+- (void)seekToBeginning:(id)sender
+{
+    UNUSED_PARAM(sender);
+    ASSERT(self.delegate);
+
+    self.delegate->seekToTime(-INFINITY);
+}
+
+- (BOOL)canSeekToEnd
+{
+    CMTime maximumTime = kCMTimeIndefinite;
+
+    for (NSValue *value in [self seekableTimeRanges])
+        maximumTime = CMTimeMaximum(CMTimeRangeGetEnd([value CMTimeRangeValue]), maximumTime);
+
+    return CMTIME_IS_NUMERIC(maximumTime);
+}
+
++ (NSSet *)keyPathsForValuesAffectingCanSeekToEnd
+{
+    return [NSSet setWithObject:@"seekableTimeRanges"];
+}
+
+- (void)seekToEnd:(id)sender
+{
+    UNUSED_PARAM(sender);
+    ASSERT(self.delegate);
+
+    self.delegate->seekToTime(INFINITY);
+}
+
 - (BOOL)hasMediaSelectionOptions
 {
     return [self hasAudioMediaSelectionOptions] || [self hasLegibleMediaSelectionOptions];

Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenModel.h (168340 => 168341)


--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenModel.h	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenModel.h	2014-05-06 01:49:29 UTC (rev 168341)
@@ -42,6 +42,10 @@
     virtual void beginScrubbing() = 0;
     virtual void endScrubbing() = 0;
     virtual void seekToTime(double time) = 0;
+    virtual void fastSeek(double time) = 0;
+    virtual void beginScanningForward() = 0;
+    virtual void beginScanningBackward() = 0;
+    virtual void endScanning() = 0;
     virtual void requestExitFullscreen() = 0;
     virtual void setVideoLayerFrame(FloatRect) = 0;
     enum VideoGravity { VideoGravityResize, VideoGravityResizeAspect, VideoGravityResizeAspectFill };

Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.h (168340 => 168341)


--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.h	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.h	2014-05-06 01:49:29 UTC (rev 168341)
@@ -60,6 +60,10 @@
     virtual void beginScrubbing() override;
     virtual void endScrubbing() override;
     virtual void seekToTime(double time) override;
+    virtual void fastSeek(double time) override;
+    virtual void beginScanningForward() override;
+    virtual void beginScanningBackward() override;
+    virtual void endScanning() override;
     virtual void requestExitFullscreen() override;
     virtual void setVideoLayerFrame(FloatRect) override;
     virtual void setVideoLayerGravity(WebVideoFullscreenModel::VideoGravity) override;

Modified: trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.mm (168340 => 168341)


--- trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.mm	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.mm	2014-05-06 01:49:29 UTC (rev 168341)
@@ -193,6 +193,42 @@
     });
 }
 
+void WebVideoFullscreenModelMediaElement::fastSeek(double time)
+{
+    __block RefPtr<WebVideoFullscreenModelMediaElement> protect(this);
+    WebThreadRun(^{
+        m_mediaElement->fastSeek(time);
+        protect.clear();
+    });
+}
+
+void WebVideoFullscreenModelMediaElement::beginScanningForward()
+{
+    __block RefPtr<WebVideoFullscreenModelMediaElement> protect(this);
+    WebThreadRun(^{
+        m_mediaElement->beginScanning(MediaControllerInterface::Forward);
+        protect.clear();
+    });
+}
+
+void WebVideoFullscreenModelMediaElement::beginScanningBackward()
+{
+    __block RefPtr<WebVideoFullscreenModelMediaElement> protect(this);
+    WebThreadRun(^{
+        m_mediaElement->beginScanning(MediaControllerInterface::Backward);
+        protect.clear();
+    });
+}
+
+void WebVideoFullscreenModelMediaElement::endScanning()
+{
+    __block RefPtr<WebVideoFullscreenModelMediaElement> protect(this);
+    WebThreadRun(^{
+        m_mediaElement->endScanning();
+        protect.clear();
+    });
+}
+
 void WebVideoFullscreenModelMediaElement::requestExitFullscreen()
 {
     __block RefPtr<WebVideoFullscreenModelMediaElement> protect(this);

Modified: trunk/Source/WebKit2/ChangeLog (168340 => 168341)


--- trunk/Source/WebKit2/ChangeLog	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebKit2/ChangeLog	2014-05-06 01:49:29 UTC (rev 168341)
@@ -1,3 +1,20 @@
+2014-05-05  Jeremy Jones  <[email protected]>
+
+        Implement scan backward and forward in video fullscreen.
+        https://bugs.webkit.org/show_bug.cgi?id=132517
+
+        Reviewed by Simon Fraser.
+
+        Plumb through scanning/seeking functions.
+
+        * UIProcess/ios/WebVideoFullscreenManagerProxy.h:
+        * UIProcess/ios/WebVideoFullscreenManagerProxy.mm:
+        (WebKit::WebVideoFullscreenManagerProxy::fastSeek):
+        (WebKit::WebVideoFullscreenManagerProxy::beginScanningForward):
+        (WebKit::WebVideoFullscreenManagerProxy::beginScanningBackward):
+        (WebKit::WebVideoFullscreenManagerProxy::endScanning):
+        * WebProcess/ios/WebVideoFullscreenManager.messages.in:
+
 2014-05-05  Benjamin Poulain  <[email protected]>
 
         [iOS][WK2] Prefetch DNS hostnames on tap highlight

Modified: trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.h (168340 => 168341)


--- trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.h	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.h	2014-05-06 01:49:29 UTC (rev 168341)
@@ -69,6 +69,10 @@
     virtual void beginScrubbing() override;
     virtual void endScrubbing() override;
     virtual void seekToTime(double) override;
+    virtual void fastSeek(double time) override;
+    virtual void beginScanningForward() override;
+    virtual void beginScanningBackward() override;
+    virtual void endScanning() override;
     virtual void setVideoLayerFrame(WebCore::FloatRect) override;
     virtual void setVideoLayerGravity(WebCore::WebVideoFullscreenModel::VideoGravity) override;
     virtual void selectAudioMediaOption(uint64_t) override;

Modified: trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm (168340 => 168341)


--- trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm	2014-05-06 01:49:29 UTC (rev 168341)
@@ -139,6 +139,26 @@
     m_page->send(Messages::WebVideoFullscreenManager::SeekToTime(time), m_page->pageID());
 }
 
+void WebVideoFullscreenManagerProxy::fastSeek(double time)
+{
+    m_page->send(Messages::WebVideoFullscreenManager::FastSeek(time), m_page->pageID());
+}
+
+void WebVideoFullscreenManagerProxy::beginScanningForward()
+{
+    m_page->send(Messages::WebVideoFullscreenManager::BeginScanningForward(), m_page->pageID());
+}
+
+void WebVideoFullscreenManagerProxy::beginScanningBackward()
+{
+    m_page->send(Messages::WebVideoFullscreenManager::BeginScanningBackward(), m_page->pageID());
+}
+
+void WebVideoFullscreenManagerProxy::endScanning()
+{
+    m_page->send(Messages::WebVideoFullscreenManager::EndScanning(), m_page->pageID());
+}
+
 void WebVideoFullscreenManagerProxy::setVideoLayerFrame(WebCore::FloatRect frame)
 {
     m_page->send(Messages::WebVideoFullscreenManager::SetVideoLayerFrame(frame), m_page->pageID());

Modified: trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.messages.in (168340 => 168341)


--- trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.messages.in	2014-05-06 01:22:02 UTC (rev 168340)
+++ trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.messages.in	2014-05-06 01:49:29 UTC (rev 168341)
@@ -28,6 +28,10 @@
     BeginScrubbing()
     EndScrubbing()
     SeekToTime(double time)
+    FastSeek(double time)
+    BeginScanningForward()
+    BeginScanningBackward()
+    EndScanning()
     RequestExitFullscreen()
     DidExitFullscreen()
     DidEnterFullscreen()
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to