| Index: third_party/WebKit/WebCore/html/HTMLMediaElement.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/html/HTMLMediaElement.cpp (revision 11154)
|
| +++ third_party/WebKit/WebCore/html/HTMLMediaElement.cpp (working copy)
|
| @@ -76,7 +76,6 @@
|
| , m_begun(false)
|
| , m_loadedFirstFrame(false)
|
| , m_autoplaying(true)
|
| - , m_currentLoop(0)
|
| , m_volume(1.0f)
|
| , m_muted(false)
|
| , m_paused(true)
|
| @@ -85,7 +84,6 @@
|
| , m_previousProgress(0)
|
| , m_previousProgressTime(numeric_limits<double>::max())
|
| , m_sentStalledEvent(false)
|
| - , m_bufferingRate(0)
|
| , m_loadNestingLevel(0)
|
| , m_terminateLoadBelowNestingLevel(0)
|
| , m_pausedInternal(false)
|
| @@ -299,14 +297,6 @@
|
| return m_networkState;
|
| }
|
|
|
| -float HTMLMediaElement::bufferingRate()
|
| -{
|
| - if (!m_player)
|
| - return 0;
|
| - return m_bufferingRate;
|
| - //return m_player->dataRate();
|
| -}
|
| -
|
| String HTMLMediaElement::canPlayType(const String& mimeType) const
|
| {
|
| MediaPlayer::SupportsType support = MediaPlayer::supportsType(ContentType(mimeType));
|
| @@ -352,7 +342,6 @@
|
|
|
| m_progressEventTimer.stop();
|
| m_sentStalledEvent = false;
|
| - m_bufferingRate = 0;
|
|
|
| m_loadTimer.stop();
|
|
|
| @@ -384,7 +373,6 @@
|
| m_player->pause();
|
| m_player->seek(0);
|
| }
|
| - m_currentLoop = 0;
|
| dispatchEventForType(eventNames().emptiedEvent, false, true);
|
| if (m_loadNestingLevel < m_terminateLoadBelowNestingLevel)
|
| goto end;
|
| @@ -471,7 +459,6 @@
|
| m_error = MediaError::create(MediaError::MEDIA_ERR_NETWORK);
|
| m_begun = false;
|
| m_progressEventTimer.stop();
|
| - m_bufferingRate = 0;
|
|
|
| initAndDispatchProgressEvent(eventNames().errorEvent);
|
| if (m_loadNestingLevel < m_terminateLoadBelowNestingLevel)
|
| @@ -490,7 +477,6 @@
|
| m_networkState = LOADING;
|
|
|
| if (state >= MediaPlayer::LoadedMetaData && m_networkState < LOADED_METADATA) {
|
| - m_player->seek(effectiveStart());
|
| m_networkState = LOADED_METADATA;
|
|
|
| dispatchEventForType(eventNames().durationchangeEvent, false, true);
|
| @@ -535,7 +521,6 @@
|
| m_begun = false;
|
| m_networkState = LOADED;
|
| m_progressEventTimer.stop();
|
| - m_bufferingRate = 0;
|
| initAndDispatchProgressEvent(eventNames().loadEvent);
|
| }
|
| }
|
| @@ -596,12 +581,9 @@
|
| unsigned progress = m_player->bytesLoaded();
|
| double time = WTF::currentTime();
|
| double timedelta = time - m_previousProgressTime;
|
| - if (timedelta)
|
| - m_bufferingRate = (float)(0.8 * m_bufferingRate + 0.2 * ((float)(progress - m_previousProgress)) / timedelta);
|
|
|
| if (progress == m_previousProgress) {
|
| if (timedelta > 3.0 && !m_sentStalledEvent) {
|
| - m_bufferingRate = 0;
|
| initAndDispatchProgressEvent(eventNames().stalledEvent);
|
| m_sentStalledEvent = true;
|
| }
|
| @@ -621,23 +603,10 @@
|
| ec = INVALID_STATE_ERR;
|
| return;
|
| }
|
| +
|
| + time = min(time, duration());
|
| + time = max(time, 0.0f);
|
|
|
| - // 2
|
| - float minTime;
|
| - if (currentLoop() == 0)
|
| - minTime = effectiveStart();
|
| - else
|
| - minTime = effectiveLoopStart();
|
| -
|
| - // 3
|
| - float maxTime = currentLoop() == playCount() - 1 ? effectiveEnd() : effectiveLoopEnd();
|
| -
|
| - // 4
|
| - time = min(time, maxTime);
|
| -
|
| - // 5
|
| - time = max(time, minTime);
|
| -
|
| // 6
|
| RefPtr<TimeRanges> seekableRanges = seekable();
|
| if (!seekableRanges->contain(time)) {
|
| @@ -657,10 +626,8 @@
|
| // 10
|
| // As soon as the user agent has established whether or not the media data for the new playback position is available,
|
| // and, if it is, decoded enough data to play back that position, the seeking DOM attribute must be set to false.
|
| - if (m_player) {
|
| - m_player->setEndTime(maxTime);
|
| + if (m_player)
|
| m_player->seek(time);
|
| - }
|
| }
|
|
|
| HTMLMediaElement::ReadyState HTMLMediaElement::readyState() const
|
| @@ -768,8 +735,7 @@
|
| }
|
| ExceptionCode unused;
|
| if (endedPlayback()) {
|
| - m_currentLoop = 0;
|
| - seek(effectiveStart(), unused);
|
| + seek(0, unused);
|
| }
|
| setPlaybackRate(defaultPlaybackRate(), unused);
|
|
|
| @@ -815,77 +781,16 @@
|
| updatePlayState();
|
| }
|
|
|
| -unsigned HTMLMediaElement::playCount() const
|
| +bool HTMLMediaElement::loop() const
|
| {
|
| - bool ok;
|
| - unsigned count = getAttribute(playcountAttr).string().toUInt(&ok);
|
| - return (count > 0 && ok) ? count : 1;
|
| + return hasAttribute(loopAttr);
|
| }
|
|
|
| -void HTMLMediaElement::setPlayCount(unsigned count, ExceptionCode& ec)
|
| +void HTMLMediaElement::setLoop(bool b)
|
| {
|
| - if (!count) {
|
| - ec = INDEX_SIZE_ERR;
|
| - return;
|
| - }
|
| - setAttribute(playcountAttr, String::number(count));
|
| - checkIfSeekNeeded();
|
| + setBooleanAttribute(loopAttr, b);
|
| }
|
|
|
| -float HTMLMediaElement::start() const
|
| -{
|
| - return getTimeOffsetAttribute(startAttr, 0);
|
| -}
|
| -
|
| -void HTMLMediaElement::setStart(float time)
|
| -{
|
| - setTimeOffsetAttribute(startAttr, time);
|
| - checkIfSeekNeeded();
|
| -}
|
| -
|
| -float HTMLMediaElement::end() const
|
| -{
|
| - return getTimeOffsetAttribute(endAttr, std::numeric_limits<float>::infinity());
|
| -}
|
| -
|
| -void HTMLMediaElement::setEnd(float time)
|
| -{
|
| - setTimeOffsetAttribute(endAttr, time);
|
| - checkIfSeekNeeded();
|
| -}
|
| -
|
| -float HTMLMediaElement::loopStart() const
|
| -{
|
| - return getTimeOffsetAttribute(loopstartAttr, start());
|
| -}
|
| -
|
| -void HTMLMediaElement::setLoopStart(float time)
|
| -{
|
| - setTimeOffsetAttribute(loopstartAttr, time);
|
| - checkIfSeekNeeded();
|
| -}
|
| -
|
| -float HTMLMediaElement::loopEnd() const
|
| -{
|
| - return getTimeOffsetAttribute(loopendAttr, end());
|
| -}
|
| -
|
| -void HTMLMediaElement::setLoopEnd(float time)
|
| -{
|
| - setTimeOffsetAttribute(loopendAttr, time);
|
| - checkIfSeekNeeded();
|
| -}
|
| -
|
| -unsigned HTMLMediaElement::currentLoop() const
|
| -{
|
| - return m_currentLoop;
|
| -}
|
| -
|
| -void HTMLMediaElement::setCurrentLoop(unsigned currentLoop)
|
| -{
|
| - m_currentLoop = currentLoop;
|
| -}
|
| -
|
| bool HTMLMediaElement::controls() const
|
| {
|
| Frame* frame = document()->frame();
|
| @@ -1008,40 +913,6 @@
|
| return mediaSrc;
|
| }
|
|
|
| -void HTMLMediaElement::checkIfSeekNeeded()
|
| -{
|
| - // 3.14.9.5. Offsets into the media resource
|
| - // 1
|
| - if (playCount() <= m_currentLoop)
|
| - m_currentLoop = playCount() - 1;
|
| -
|
| - // 2
|
| - if (networkState() <= LOADING)
|
| - return;
|
| -
|
| - // 3
|
| - ExceptionCode ec;
|
| - float time = currentTime();
|
| - if (!m_currentLoop && time < effectiveStart())
|
| - seek(effectiveStart(), ec);
|
| -
|
| - // 4
|
| - if (m_currentLoop && time < effectiveLoopStart())
|
| - seek(effectiveLoopStart(), ec);
|
| -
|
| - // 5
|
| - if (m_currentLoop < playCount() - 1 && time > effectiveLoopEnd()) {
|
| - seek(effectiveLoopStart(), ec);
|
| - m_currentLoop++;
|
| - }
|
| -
|
| - // 6
|
| - if (m_currentLoop == playCount() - 1 && time > effectiveEnd())
|
| - seek(effectiveEnd(), ec);
|
| -
|
| - updatePlayState();
|
| -}
|
| -
|
| void HTMLMediaElement::mediaPlayerTimeChanged(MediaPlayer*)
|
| {
|
| beginProcessingMediaPlayerCallback();
|
| @@ -1050,17 +921,16 @@
|
| m_seeking = false;
|
|
|
| float now = currentTime();
|
| - if (m_currentLoop < playCount() - 1 && now >= effectiveLoopEnd()) {
|
| - ExceptionCode ec;
|
| - seek(effectiveLoopStart(), ec);
|
| - m_currentLoop++;
|
| - dispatchEventForType(eventNames().timeupdateEvent, false, true);
|
| + if (now >= duration()) {
|
| + if (loop()) {
|
| + ExceptionCode ec;
|
| + seek(0, ec);
|
| + dispatchEventForType(eventNames().timeupdateEvent, false, true);
|
| + } else {
|
| + dispatchEventForType(eventNames().timeupdateEvent, false, true);
|
| + dispatchEventForType(eventNames().endedEvent, false, true);
|
| + }
|
| }
|
| -
|
| - if (m_currentLoop == playCount() - 1 && now >= effectiveEnd()) {
|
| - dispatchEventForType(eventNames().timeupdateEvent, false, true);
|
| - dispatchEventForType(eventNames().endedEvent, false, true);
|
| - }
|
|
|
| updatePlayState();
|
|
|
| @@ -1104,34 +974,6 @@
|
| return TimeRanges::create(0, m_player->maxTimeSeekable());
|
| }
|
|
|
| -float HTMLMediaElement::effectiveStart() const
|
| -{
|
| - if (!m_player)
|
| - return 0;
|
| - return min(start(), m_player->duration());
|
| -}
|
| -
|
| -float HTMLMediaElement::effectiveEnd() const
|
| -{
|
| - if (!m_player)
|
| - return 0;
|
| - return min(max(end(), max(start(), loopStart())), m_player->duration());
|
| -}
|
| -
|
| -float HTMLMediaElement::effectiveLoopStart() const
|
| -{
|
| - if (!m_player)
|
| - return 0;
|
| - return min(loopStart(), m_player->duration());
|
| -}
|
| -
|
| -float HTMLMediaElement::effectiveLoopEnd() const
|
| -{
|
| - if (!m_player)
|
| - return 0;
|
| - return min(max(start(), max(loopStart(), loopEnd())), m_player->duration());
|
| -}
|
| -
|
| bool HTMLMediaElement::activelyPlaying() const
|
| {
|
| return !paused() && readyState() >= CAN_PLAY && !endedPlayback(); // && !stoppedDueToErrors() && !pausedForUserInteraction();
|
| @@ -1139,7 +981,7 @@
|
|
|
| bool HTMLMediaElement::endedPlayback() const
|
| {
|
| - return networkState() >= LOADED_METADATA && currentTime() >= effectiveEnd() && currentLoop() == playCount() - 1;
|
| + return networkState() >= LOADED_METADATA && currentTime() >= duration() && !loop();
|
| }
|
|
|
| void HTMLMediaElement::updateVolume()
|
| @@ -1170,9 +1012,7 @@
|
| return;
|
| }
|
|
|
| - m_player->setEndTime(currentLoop() == playCount() - 1 ? effectiveEnd() : effectiveLoopEnd());
|
| -
|
| - bool shouldBePlaying = activelyPlaying() && currentTime() < effectiveEnd();
|
| + bool shouldBePlaying = activelyPlaying();
|
| if (shouldBePlaying && m_player->paused())
|
| m_player->play();
|
| else if (!shouldBePlaying && !m_player->paused())
|
|
|