diff options
Diffstat (limited to 'WebCore/html/HTMLMediaElement.cpp')
-rw-r--r-- | WebCore/html/HTMLMediaElement.cpp | 58 |
1 files changed, 24 insertions, 34 deletions
diff --git a/WebCore/html/HTMLMediaElement.cpp b/WebCore/html/HTMLMediaElement.cpp index ad465bb..94c0dd2 100644 --- a/WebCore/html/HTMLMediaElement.cpp +++ b/WebCore/html/HTMLMediaElement.cpp @@ -108,8 +108,9 @@ HTMLMediaElement::HTMLMediaElement(const QualifiedName& tagName, Document* doc) #endif , m_restrictions(NoRestrictions) , m_preload(MediaPlayer::Auto) - , m_playing(false) + , m_displayMode(Unknown) , m_processingMediaPlayerCallback(0) + , m_playing(false) , m_isWaitingUntilMediaCanStart(false) , m_processingLoad(false) , m_delayingTheLoadEvent(false) @@ -494,6 +495,7 @@ void HTMLMediaElement::prepareForLoad() m_sentStalledEvent = false; m_haveFiredLoadedData = false; m_completelyLoaded = false; + m_displayMode = Unknown; // 1 - Abort any already-running instance of the resource selection algorithm for this element. m_currentSourceNode = 0; @@ -533,7 +535,6 @@ void HTMLMediaElement::prepareForLoad() m_playedTimeRanges = TimeRanges::create(); m_lastSeekTime = 0; m_closedCaptionsVisible = false; - } void HTMLMediaElement::loadInternal() @@ -671,11 +672,9 @@ void HTMLMediaElement::loadResource(const KURL& initialURL, ContentType& content #endif m_player->load(m_currentSrc, contentType); - if (isVideo() && m_player->canLoadPoster()) { - KURL posterURL = getNonEmptyURLAttribute(posterAttr); - if (!posterURL.isEmpty()) - m_player->setPoster(posterURL); - } + // If there is no poster to display, allow the media engine to render video frames as soon as + // they are available. + updateDisplayState(); if (renderer()) renderer()->updateFromElement(); @@ -746,7 +745,7 @@ void HTMLMediaElement::noneSupported() // 9 -Abort these steps. Until the load() method is invoked, the element won't attempt to load another resource. - updatePosterImage(); + updateDisplayState(); if (renderer()) renderer()->updateFromElement(); @@ -835,7 +834,7 @@ void HTMLMediaElement::setNetworkState(MediaPlayer::NetworkState state) else if (state == MediaPlayer::FormatError && m_loadState == LoadingFromSrcAttr) noneSupported(); - updatePosterImage(); + updateDisplayState(); return; } @@ -917,17 +916,13 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) if (m_readyState >= HAVE_METADATA && oldState < HAVE_METADATA) { scheduleEvent(eventNames().durationchangeEvent); scheduleEvent(eventNames().loadedmetadataEvent); - -#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) - if (renderer() && renderer()->isVideo()) { - toRenderVideo(renderer())->videoSizeChanged(); - } -#endif + if (renderer()) + renderer()->updateFromElement(); m_delayingTheLoadEvent = false; m_player->seek(0); } - bool shouldUpdatePosterImage = false; + bool shouldUpdateDisplayState = false; // 4.8.10.7 says loadeddata is sent only when the new state *is* HAVE_CURRENT_DATA: "If the // previous ready state was HAVE_METADATA and the new ready state is HAVE_CURRENT_DATA", @@ -936,7 +931,7 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) // We go with the later because it seems useful to count on getting this event if (m_readyState >= HAVE_CURRENT_DATA && oldState < HAVE_CURRENT_DATA && !m_haveFiredLoadedData) { m_haveFiredLoadedData = true; - shouldUpdatePosterImage = true; + shouldUpdateDisplayState = true; scheduleEvent(eventNames().loadeddataEvent); } @@ -945,7 +940,7 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) scheduleEvent(eventNames().canplayEvent); if (isPotentiallyPlaying) scheduleEvent(eventNames().playingEvent); - shouldUpdatePosterImage = true; + shouldUpdateDisplayState = true; } if (m_readyState == HAVE_ENOUGH_DATA && oldState < HAVE_ENOUGH_DATA) { @@ -963,11 +958,11 @@ void HTMLMediaElement::setReadyState(MediaPlayer::ReadyState state) scheduleEvent(eventNames().playingEvent); } - shouldUpdatePosterImage = true; + shouldUpdateDisplayState = true; } - if (shouldUpdatePosterImage) - updatePosterImage(); + if (shouldUpdateDisplayState) + updateDisplayState(); updatePlayState(); } @@ -1071,7 +1066,6 @@ void HTMLMediaElement::seek(float time, ExceptionCode& ec) m_player->seek(time); // 10-15 are handled, if necessary, when the engine signals a readystate change. - } void HTMLMediaElement::finishSeek() @@ -1081,6 +1075,8 @@ void HTMLMediaElement::finishSeek() // 4.8.10.10 Seeking step 13 scheduleEvent(eventNames().seekedEvent); + + setDisplayMode(Video); } HTMLMediaElement::ReadyState HTMLMediaElement::readyState() const @@ -1585,13 +1581,8 @@ void HTMLMediaElement::mediaPlayerDurationChanged(MediaPlayer*) { beginProcessingMediaPlayerCallback(); scheduleEvent(eventNames().durationchangeEvent); -#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) - if (renderer()) { + if (renderer()) renderer()->updateFromElement(); - if (renderer()->isVideo()) - toRenderVideo(renderer())->videoSizeChanged(); - } -#endif endProcessingMediaPlayerCallback(); } @@ -1619,20 +1610,17 @@ void HTMLMediaElement::mediaPlayerSawUnsupportedTracks(MediaPlayer*) void HTMLMediaElement::mediaPlayerRepaint(MediaPlayer*) { beginProcessingMediaPlayerCallback(); + updateDisplayState(); if (renderer()) renderer()->repaint(); - - updatePosterImage(); endProcessingMediaPlayerCallback(); } void HTMLMediaElement::mediaPlayerSizeChanged(MediaPlayer*) { beginProcessingMediaPlayerCallback(); -#if !ENABLE(PLUGIN_PROXY_FOR_VIDEO) - if (renderer() && renderer()->isVideo()) - toRenderVideo(renderer())->videoSizeChanged(); -#endif + if (renderer()) + renderer()->updateFromElement(); endProcessingMediaPlayerCallback(); } @@ -1783,6 +1771,8 @@ void HTMLMediaElement::updatePlayState() bool shouldBePlaying = potentiallyPlaying(); bool playerPaused = m_player->paused(); if (shouldBePlaying && playerPaused) { + setDisplayMode(Video); + // Set rate before calling play in case the rate was set before the media engine wasn't setup. // The media engine should just stash the rate since it isn't already playing. m_player->setRate(m_playbackRate); |