MediaPlayerPrivateAVFoundation::MediaRenderingMode MediaPlayerPrivateAVFoundation::preferredRenderingMode() const { if (!m_player->visible() || assetStatus() == MediaPlayerAVAssetStatusUnknown) return MediaRenderingNone; if (supportsAcceleratedRendering() && m_player->client().mediaPlayerRenderingCanBeAccelerated(m_player)) return MediaRenderingToLayer; return MediaRenderingToContext; }
MediaPlayer::MovieLoadType MediaPlayerPrivateAVFoundation::movieLoadType() const { if (!metaDataAvailable() || assetStatus() == MediaPlayerAVAssetStatusUnknown) return MediaPlayer::Unknown; if (isLiveStream()) return MediaPlayer::LiveStream; return MediaPlayer::Download; }
MediaPlayerPrivateAVFoundation::MediaRenderingMode MediaPlayerPrivateAVFoundation::preferredRenderingMode() const { if (!m_player->visible() || !m_player->frameView() || assetStatus() == MediaPlayerAVAssetStatusUnknown) return MediaRenderingNone; #if USE(ACCELERATED_COMPOSITING) if (supportsAcceleratedRendering() && m_player->mediaPlayerClient()->mediaPlayerRenderingCanBeAccelerated(m_player)) return MediaRenderingToLayer; #endif return MediaRenderingToContext; }
void MediaPlayerPrivateAVFoundation::playabilityKnown() { LOG(Media, "MediaPlayerPrivateAVFoundation::playabilityKnown(%p)", this); if (m_assetIsPlayable) return; // Nothing more to do if we already have all of the item's metadata. if (assetStatus() > MediaPlayerAVAssetStatusLoading) { LOG(Media, "MediaPlayerPrivateAVFoundation::playabilityKnown(%p) - all metadata loaded", this); return; } // At this point we are supposed to load metadata. It is OK to ask the asset to load the same // information multiple times, because if it has already been loaded the completion handler // will just be called synchronously. m_loadingMetadata = true; beginLoadingMetadata(); }
void MediaPlayerPrivateAVFoundation::setPreload(MediaPlayer::Preload preload) { m_preload = preload; if (!m_assetURL.length()) return; setDelayCallbacks(true); if (m_preload >= MediaPlayer::MetaData && assetStatus() == MediaPlayerAVAssetStatusDoesNotExist) { createAVAssetForURL(m_assetURL); createAVPlayer(); checkPlayability(); } // Don't force creation of the player item unless we already know that the asset is playable. If we aren't // there yet, or if we already know it is not playable, creating it now won't help. if (m_preload == MediaPlayer::Auto && m_assetIsPlayable) createAVPlayerItem(); setDelayCallbacks(false); }
void MediaPlayerPrivateAVFoundation::setPreload(MediaPlayer::Preload preload) { m_preload = preload; if (!m_assetURL.length()) return; setDelayCallbacks(true); if (m_preload >= MediaPlayer::MetaData && assetStatus() == MediaPlayerAVAssetStatusDoesNotExist) { #if ENABLE(OFFLINE_WEB_APPLICATIONS) Frame* frame = m_player->frameView() ? m_player->frameView()->frame() : 0; ApplicationCacheHost* cacheHost = frame ? frame->loader()->documentLoader()->applicationCacheHost() : 0; ApplicationCacheResource* resource; if (cacheHost && cacheHost->shouldLoadResourceFromApplicationCache(ResourceRequest(m_assetURL), resource) && resource) { // AVFoundation can't open arbitrary data pointers, so if this ApplicationCacheResource doesn't // have a valid local path, just open the resource's original URL. if (resource->path().isEmpty()) createAVAssetForURL(resource->url()); else createAVAssetForCacheResource(resource); } else #endif createAVAssetForURL(m_assetURL); createAVPlayer(); checkPlayability(); } // Don't force creation of the player item unless we already know that the asset is playable. If we aren't // there yet, or if we already know it is not playable, creating it now won't help. if (m_preload == MediaPlayer::Auto && m_assetIsPlayable) createAVPlayerItem(); setDelayCallbacks(false); }
void MediaPlayerPrivateAVFoundation::updateStates() { MediaPlayer::NetworkState oldNetworkState = m_networkState; MediaPlayer::ReadyState oldReadyState = m_readyState; LOG(Media, "MediaPlayerPrivateAVFoundation::updateStates(%p) - entering with networkState = %i, readyState = %i", this, static_cast<int>(m_networkState), static_cast<int>(m_readyState)); if (m_loadingMetadata) m_networkState = MediaPlayer::Loading; else { // -loadValuesAsynchronouslyForKeys:completionHandler: has invoked its handler; test status of keys and determine state. AVAssetStatus avAssetStatus = assetStatus(); ItemStatus itemStatus = playerItemStatus(); m_assetIsPlayable = (avAssetStatus == MediaPlayerAVAssetStatusPlayable); if (m_readyState < MediaPlayer::HaveMetadata && avAssetStatus > MediaPlayerAVAssetStatusLoading) { if (m_assetIsPlayable) { if (itemStatus == MediaPlayerAVPlayerItemStatusUnknown) { if (avAssetStatus == MediaPlayerAVAssetStatusFailed || m_preload > MediaPlayer::MetaData) { // We may have a playable asset that doesn't support inspection prior to playback; go ahead // and create the AVPlayerItem now. When the AVPlayerItem becomes ready to play, we will // have access to its metadata. Or we may have been asked to become ready to play immediately. m_networkState = MediaPlayer::Loading; prepareToPlay(); } else m_networkState = MediaPlayer::Idle; } if (avAssetStatus == MediaPlayerAVAssetStatusLoaded) m_readyState = MediaPlayer::HaveMetadata; } else { // FIX ME: fetch the error associated with the @"playable" key to distinguish between format // and network errors. m_networkState = MediaPlayer::FormatError; } } if (avAssetStatus >= MediaPlayerAVAssetStatusLoaded && itemStatus > MediaPlayerAVPlayerItemStatusUnknown) { if (seeking()) m_readyState = m_readyState >= MediaPlayer::HaveMetadata ? MediaPlayer::HaveMetadata : MediaPlayer::HaveNothing; else { float maxLoaded = maxTimeLoaded(); switch (itemStatus) { case MediaPlayerAVPlayerItemStatusUnknown: break; case MediaPlayerAVPlayerItemStatusFailed: m_networkState = MediaPlayer::DecodeError; break; case MediaPlayerAVPlayerItemStatusPlaybackLikelyToKeepUp: m_readyState = MediaPlayer::HaveEnoughData; break; case MediaPlayerAVPlayerItemStatusReadyToPlay: case MediaPlayerAVPlayerItemStatusPlaybackBufferEmpty: case MediaPlayerAVPlayerItemStatusPlaybackBufferFull: if (maxLoaded > currentTime()) m_readyState = MediaPlayer::HaveFutureData; else m_readyState = MediaPlayer::HaveCurrentData; break; } if (itemStatus >= MediaPlayerAVPlayerItemStatusReadyToPlay) m_networkState = (maxLoaded == duration()) ? MediaPlayer::Loaded : MediaPlayer::Loading; } } } if (isReadyForVideoSetup() && currentRenderingMode() != preferredRenderingMode()) setUpVideoRendering(); if (m_networkState != oldNetworkState) m_player->networkStateChanged(); if (m_readyState != oldReadyState) m_player->readyStateChanged(); LOG(Media, "MediaPlayerPrivateAVFoundation::updateStates(%p) - exiting with networkState = %i, readyState = %i", this, static_cast<int>(m_networkState), static_cast<int>(m_readyState)); }