Changeset 181259 in webkit


Ignore:
Timestamp:
Mar 8, 2015 9:55:11 PM (9 years ago)
Author:
dino@apple.com
Message:

[iOS Media] Video buffer progress missing on iPhones
https://bugs.webkit.org/show_bug.cgi?id=142462

Reviewed by Eric Carlson.

Source/WebCore:

The fullscreen controller on the iPhone idiom was using
the media duration as its maximum loaded time, meaning the
download progress was missing (it looked like everything
was already downloaded). The fix is to calculate
what the maximum buffered time is from the HTMLMediaElement,
and send that to the fullscreen controller.

  • Modules/mediacontrols/mediaControlsiOS.js:

(ControllerIOS.prototype.drawTimelineBackground): While implementing
the native function I noticed that the JS controls forgot that
the buffered time ranges are ordered, and thus they don't need
to search through the array. The last range will be the highest.

  • html/HTMLMediaElement.cpp:

(WebCore::HTMLMediaElement::maxBufferedTime): New helper function
to calculate the highest buffered time in the media source.

  • html/HTMLMediaElement.h:
  • platform/ios/WebVideoFullscreenInterface.h: New setBufferedTime method.
  • platform/ios/WebVideoFullscreenInterfaceAVKit.h:
  • platform/ios/WebVideoFullscreenInterfaceAVKit.mm:

(WebVideoFullscreenInterfaceAVKit::setDuration): No longer set
the loadedTimeRanges.
(WebVideoFullscreenInterfaceAVKit::setBufferedTime): Calculate a normalized
value of the maximum loaded/buffered time, and tell the platform controller
to show that range.

  • platform/ios/WebVideoFullscreenModelVideoElement.mm:

(WebVideoFullscreenModelVideoElement::updateForEventName): Send the maximum
buffered time.

Source/WebKit2:

Coordinate the SetBufferedTime message between the Web and UI
processes.

  • UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in: New message SetBufferedTime.
  • WebProcess/ios/WebVideoFullscreenManager.h:
  • WebProcess/ios/WebVideoFullscreenManager.mm:

(WebKit::WebVideoFullscreenManager::setBufferedTime):

Location:
trunk/Source
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r181256 r181259  
     12015-03-08  Dean Jackson  <dino@apple.com>
     2
     3        [iOS Media] Video buffer progress missing on iPhones
     4        https://bugs.webkit.org/show_bug.cgi?id=142462
     5
     6        Reviewed by Eric Carlson.
     7
     8        The fullscreen controller on the iPhone idiom was using
     9        the media duration as its maximum loaded time, meaning the
     10        download progress was missing (it looked like everything
     11        was already downloaded). The fix is to calculate
     12        what the maximum buffered time is from the HTMLMediaElement,
     13        and send that to the fullscreen controller.
     14
     15        * Modules/mediacontrols/mediaControlsiOS.js:
     16        (ControllerIOS.prototype.drawTimelineBackground): While implementing
     17        the native function I noticed that the JS controls forgot that
     18        the buffered time ranges are ordered, and thus they don't need
     19        to search through the array. The last range will be the highest.
     20
     21        * html/HTMLMediaElement.cpp:
     22        (WebCore::HTMLMediaElement::maxBufferedTime): New helper function
     23        to calculate the highest buffered time in the media source.
     24        * html/HTMLMediaElement.h:
     25
     26        * platform/ios/WebVideoFullscreenInterface.h: New setBufferedTime method.
     27        * platform/ios/WebVideoFullscreenInterfaceAVKit.h:
     28
     29        * platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
     30        (WebVideoFullscreenInterfaceAVKit::setDuration): No longer set
     31        the loadedTimeRanges.
     32        (WebVideoFullscreenInterfaceAVKit::setBufferedTime): Calculate a normalized
     33        value of the maximum loaded/buffered time, and tell the platform controller
     34        to show that range.
     35
     36        * platform/ios/WebVideoFullscreenModelVideoElement.mm:
     37        (WebVideoFullscreenModelVideoElement::updateForEventName): Send the maximum
     38        buffered time.
     39
    1402015-03-08  Chris Dumez  <cdumez@apple.com>
    241
  • trunk/Source/WebCore/Modules/mediacontrols/mediaControlsiOS.js

    r181091 r181259  
    308308        var played = this.video.currentTime / this.video.duration;
    309309        var buffered = 0;
    310         for (var i = 0, end = this.video.buffered.length; i < end; ++i)
    311             buffered = Math.max(this.video.buffered.end(i), buffered);
     310        var bufferedRanges = this.video.buffered;
     311        if (bufferedRanges && bufferedRanges.length)
     312            buffered = Math.max(bufferedRanges.end(bufferedRanges.length - 1), buffered);
    312313
    313314        buffered /= this.video.duration;
  • trunk/Source/WebCore/html/HTMLMediaElement.cpp

    r181153 r181259  
    43784378}
    43794379
     4380double HTMLMediaElement::maxBufferedTime() const
     4381{
     4382    RefPtr<TimeRanges> bufferedRanges = buffered();
     4383    unsigned numRanges = bufferedRanges->length();
     4384    if (!numRanges)
     4385        return 0;
     4386
     4387    return bufferedRanges->end(numRanges - 1, ASSERT_NO_EXCEPTION);
     4388}
     4389
    43804390PassRefPtr<TimeRanges> HTMLMediaElement::played()
    43814391{
  • trunk/Source/WebCore/html/HTMLMediaElement.h

    r181169 r181259  
    447447    bool isDisablingSleep() const { return m_sleepDisabler.get(); }
    448448
     449    double maxBufferedTime() const;
     450
    449451protected:
    450452    HTMLMediaElement(const QualifiedName&, Document&, bool);
  • trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterface.h

    r179480 r181259  
    4848    virtual void setDuration(double) = 0;
    4949    virtual void setCurrentTime(double currentTime, double anchorTime) = 0;
     50    virtual void setBufferedTime(double bufferedTime) = 0;
    5051    virtual void setRate(bool isPlaying, float playbackRate) = 0;
    5152    virtual void setVideoDimensions(bool hasVideo, float width, float height) = 0;
  • trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h

    r181173 r181259  
    7777    WEBCORE_EXPORT virtual void setDuration(double) override;
    7878    WEBCORE_EXPORT virtual void setCurrentTime(double currentTime, double anchorTime) override;
     79    WEBCORE_EXPORT virtual void setBufferedTime(double bufferedTime) override;
    7980    WEBCORE_EXPORT virtual void setRate(bool isPlaying, float playbackRate) override;
    8081    WEBCORE_EXPORT virtual void setVideoDimensions(bool hasVideo, float width, float height) override;
  • trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm

    r181173 r181259  
    722722        playerController.maxTime = duration;
    723723        playerController.contentDurationWithinEndTimes = duration;
    724         playerController.loadedTimeRanges = @[@0, @(duration)];
    725        
     724
    726725        // FIXME: we take this as an indication that playback is ready.
    727726        playerController.canPlay = YES;
     
    744743            anchorTimeStamp:anchorTimeStamp rate:0];
    745744        [strongThis->m_playerController setTiming:timing];
     745    });
     746}
     747
     748void WebVideoFullscreenInterfaceAVKit::setBufferedTime(double bufferedTime)
     749{
     750    RefPtr<WebVideoFullscreenInterfaceAVKit> strongThis(this);
     751
     752    dispatch_async(dispatch_get_main_queue(), [strongThis, bufferedTime] {
     753        WebAVPlayerController* playerController = strongThis->m_playerController.get();
     754        double duration = playerController.contentDuration;
     755        double normalizedBufferedTime;
     756        if (!duration)
     757            normalizedBufferedTime = 0;
     758        else
     759            normalizedBufferedTime = bufferedTime / duration;
     760        playerController.loadedTimeRanges = @[@0, @(normalizedBufferedTime)];
    746761    });
    747762}
  • trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelVideoElement.mm

    r179768 r181259  
    121121        || eventName == eventNames().timeupdateEvent) {
    122122        m_videoFullscreenInterface->setCurrentTime(m_videoElement->currentTime(), [[NSProcessInfo processInfo] systemUptime]);
     123        m_videoFullscreenInterface->setBufferedTime(m_videoElement->maxBufferedTime());
    123124        // FIXME: 130788 - find a better event to update seekable ranges from.
    124125        m_videoFullscreenInterface->setSeekableRanges(*m_videoElement->seekable());
  • trunk/Source/WebKit2/ChangeLog

    r181252 r181259  
     12015-03-08  Dean Jackson  <dino@apple.com>
     2
     3        [iOS Media] Video buffer progress missing on iPhones
     4        https://bugs.webkit.org/show_bug.cgi?id=142462
     5
     6        Reviewed by Eric Carlson.
     7
     8        Coordinate the SetBufferedTime message between the Web and UI
     9        processes.
     10
     11        * UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in: New message SetBufferedTime.
     12        * WebProcess/ios/WebVideoFullscreenManager.h:
     13        * WebProcess/ios/WebVideoFullscreenManager.mm:
     14        (WebKit::WebVideoFullscreenManager::setBufferedTime):
     15
    1162015-03-08  Sam Weinig  <sam@webkit.org>
    217
  • trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in

    r181173 r181259  
    2525    ResetMediaState()
    2626    SetCurrentTime(double currentTime, double hostTime)
     27    SetBufferedTime(double bufferedTime)
    2728    SetVideoDimensions(bool hasVideo, unsigned width, unsigned height)
    2829    SetSeekableRangesVector(Vector<std::pair<double, double>> ranges);
  • trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.h

    r181173 r181259  
    7272    virtual void setDuration(double) override;
    7373    virtual void setCurrentTime(double currentTime, double anchorTime) override;
     74    virtual void setBufferedTime(double bufferedTime) override;
    7475    virtual void setRate(bool isPlaying, float playbackRate) override;
    7576    virtual void setVideoDimensions(bool hasVideo, float width, float height) override;
  • trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm

    r181173 r181259  
    135135}
    136136
     137void WebVideoFullscreenManager::setBufferedTime(double bufferedTime)
     138{
     139    m_page->send(Messages::WebVideoFullscreenManagerProxy::SetBufferedTime(bufferedTime), m_page->pageID());
     140}
     141
    137142void WebVideoFullscreenManager::setRate(bool isPlaying, float playbackRate)
    138143{
Note: See TracChangeset for help on using the changeset viewer.