Log Message
Merged r168755.
Modified Paths
- branches/safari-538.34-branch/Source/WebCore/ChangeLog
- branches/safari-538.34-branch/Source/WebCore/html/HTMLMediaElement.cpp
- branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm
- branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h
- branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm
- branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp
Diff
Modified: branches/safari-538.34-branch/Source/WebCore/ChangeLog (168822 => 168823)
--- branches/safari-538.34-branch/Source/WebCore/ChangeLog 2014-05-14 09:03:09 UTC (rev 168822)
+++ branches/safari-538.34-branch/Source/WebCore/ChangeLog 2014-05-14 09:06:12 UTC (rev 168823)
@@ -1,5 +1,53 @@
2014-05-14 Lucas Forschler <[email protected]>
+ Merge r168755
+
+ 2014-05-13 Eric Carlson <[email protected]>
+
+ [Mac] hasVideo should return true when video is ready to display
+ https://bugs.webkit.org/show_bug.cgi?id=132885
+
+ Reviewed by Jer Noble.
+
+ * html/HTMLMediaElement.cpp:
+ (WebCore::HTMLMediaElement::parseAttribute):
+
+ * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm:
+ (WebCore::AudioTrackPrivateAVFObjC::resetPropertiesFromTrack): Don't change the
+ enabled state of the AVPlayerItemTrack during setup.
+
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+ * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::MediaPlayerPrivateAVFoundationObjC): Initialize
+ m_cachedIsReadyForDisplay.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::cancelLoad): Remove "enabled" KVO observers.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoLayer): Observe "readyForDisplay"
+ change notifications.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::destroyVideoLayer): Remove for "readyForDisplay"
+ observer.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::hasAvailableVideoFrame): Return cached readyForDisplay
+ state instead of polling every time.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksChanged): Call setHasVideo(true) if the
+ player layer is ready for display.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::updateAudioTracks): Update logging.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::updateVideoTracks): Ditto.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::firstFrameAvailableDidChange): Cache readyForDisplay
+ state, call tracksChanged() if we haven't seen a video track yet.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::trackEnabledDidChange): New.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::metadataDidArrive): Correct logging.
+ (WebCore::MediaPlayerPrivateAVFoundationObjC::tracksDidChange): Remove old "enabled" listeners
+ before release tracks, add new ones to new tracks.
+ (WebCore::assetTrackMetadataKeyNames): Add "enabled" to the list of properties we require to
+ be loaded before announcing that metadata has loaded.
+ (-[WebCoreAVFMovieObserver observeValueForKeyPath:ofObject:change:context:]): Observe
+ "readyForDisplay" and "enabled".
+
+ * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp:
+ (WebCore::VideoTrackPrivateAVFObjC::resetPropertiesFromTrack): Don't change the
+ enabled state of the AVPlayerItemTrack during setup.
+
+2014-05-14 Lucas Forschler <[email protected]>
+
Merge r168750
2014-05-13 Myles C. Maxfield <[email protected]>
Modified: branches/safari-538.34-branch/Source/WebCore/html/HTMLMediaElement.cpp (168822 => 168823)
--- branches/safari-538.34-branch/Source/WebCore/html/HTMLMediaElement.cpp 2014-05-14 09:03:09 UTC (rev 168822)
+++ branches/safari-538.34-branch/Source/WebCore/html/HTMLMediaElement.cpp 2014-05-14 09:06:12 UTC (rev 168823)
@@ -4235,7 +4235,8 @@
void HTMLMediaElement::mediaPlayerFirstVideoFrameAvailable(MediaPlayer*)
{
- LOG(Media, "HTMLMediaElement::mediaPlayerFirstVideoFrameAvailable");
+ LOG(Media, "HTMLMediaElement::mediaPlayerFirstVideoFrameAvailable(%p) - current display mode = %i", this, (int)displayMode());
+
beginProcessingMediaPlayerCallback();
if (displayMode() == PosterWaitingForVideo) {
setDisplayMode(Video);
@@ -4255,6 +4256,11 @@
markCaptionAndSubtitleTracksAsUnconfigured(AfterDelay);
#endif
+ if (potentiallyPlaying() && displayMode() == PosterWaitingForVideo) {
+ setDisplayMode(Video);
+ mediaPlayerRenderingModeChanged(m_player.get());
+ }
+
if (hasMediaControls())
mediaControls()->reset();
if (renderer())
Modified: branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm (168822 => 168823)
--- branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm 2014-05-14 09:03:09 UTC (rev 168822)
+++ branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm 2014-05-14 09:06:12 UTC (rev 168823)
@@ -39,7 +39,10 @@
void AudioTrackPrivateAVFObjC::resetPropertiesFromTrack()
{
- setEnabled(m_impl->enabled());
+ // Don't call this->setEnabled() because it also sets the enabled state of the
+ // AVPlayerItemTrack
+ AudioTrackPrivateAVF::setEnabled(m_impl->enabled());
+
setKind(m_impl->audioKind());
setId(m_impl->id());
setLabel(m_impl->label());
Modified: branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (168822 => 168823)
--- branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h 2014-05-14 09:03:09 UTC (rev 168822)
+++ branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h 2014-05-14 09:06:12 UTC (rev 168823)
@@ -110,6 +110,8 @@
void durationDidChange(double);
void rateDidChange(double);
void metadataDidArrive(RetainPtr<NSArray>, double);
+ void firstFrameAvailableDidChange(bool);
+ void trackEnabledDidChange(bool);
virtual void setShouldBufferData(bool);
@@ -331,6 +333,7 @@
bool m_cachedBufferFull;
bool m_cachedHasEnabledAudio;
bool m_shouldBufferData;
+ bool m_cachedIsReadyForDisplay;
#if ENABLE(IOS_AIRPLAY)
mutable bool m_allowsWirelessVideoPlayback;
#endif
Modified: branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (168822 => 168823)
--- branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm 2014-05-14 09:03:09 UTC (rev 168822)
+++ branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm 2014-05-14 09:06:12 UTC (rev 168823)
@@ -246,7 +246,9 @@
enum MediaPlayerAVFoundationObservationContext {
MediaPlayerAVFoundationObservationContextPlayerItem,
- MediaPlayerAVFoundationObservationContextPlayer
+ MediaPlayerAVFoundationObservationContextPlayerItemTrack,
+ MediaPlayerAVFoundationObservationContextPlayer,
+ MediaPlayerAVFoundationObservationContextAVPlayerLayer,
};
#if HAVE(AVFOUNDATION_MEDIA_SELECTION_GROUP) && HAVE(AVFOUNDATION_LEGIBLE_OUTPUT_SUPPORT)
@@ -375,6 +377,7 @@
, m_cachedBufferFull(false)
, m_cachedHasEnabledAudio(false)
, m_shouldBufferData(true)
+ , m_cachedIsReadyForDisplay(false)
#if ENABLE(IOS_AIRPLAY)
, m_allowsWirelessVideoPlayback(true)
#endif
@@ -452,11 +455,14 @@
m_cachedItemStatus = MediaPlayerAVPlayerItemStatusDoesNotExist;
m_cachedSeekableRanges = nullptr;
m_cachedLoadedRanges = nullptr;
- m_cachedTracks = nullptr;
m_cachedHasEnabledAudio = false;
m_cachedPresentationSize = FloatSize();
m_cachedDuration = 0;
+ for (AVPlayerItemTrack *track in m_cachedTracks.get())
+ [track removeObserver:m_objcObserver.get() forKeyPath:@"enabled"];
+ m_cachedTracks = nullptr;
+
setIgnoreLoadStateChanges(false);
}
@@ -537,6 +543,7 @@
#ifndef NDEBUG
[m_videoLayer.get() setName:@"MediaPlayerPrivate AVPlayerLayer"];
#endif
+ [m_videoLayer.get() addObserver:m_objcObserver.get() forKeyPath:@"readyForDisplay" options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextAVPlayerLayer];
updateVideoLayerGravity();
LOG(Media, "MediaPlayerPrivateAVFoundationObjC::createVideoLayer(%p) - returning %p", this, m_videoLayer.get());
@@ -557,6 +564,7 @@
LOG(Media, "MediaPlayerPrivateAVFoundationObjC::destroyVideoLayer(%p) - destroying %p", this, m_videoLayer.get());
+ [m_videoLayer.get() removeObserver:m_objcObserver.get() forKeyPath:@"readyForDisplay"];
[m_videoLayer.get() setPlayer:nil];
#if PLATFORM(IOS)
@@ -570,7 +578,7 @@
bool MediaPlayerPrivateAVFoundationObjC::hasAvailableVideoFrame() const
{
if (currentRenderingMode() == MediaRenderingToLayer)
- return m_videoLayer && [m_videoLayer.get() isReadyForDisplay];
+ return m_cachedIsReadyForDisplay;
return m_videoFrameHasDrawn;
}
@@ -1485,7 +1493,11 @@
}
}
- setHasVideo(hasVideo);
+ // Always says we have video if the AVPlayerLayer is ready for diaplay to work around
+ // an AVFoundation bug which causes it to sometimes claim a track is disabled even
+ // when it is not.
+ setHasVideo(hasVideo || m_cachedIsReadyForDisplay);
+
setHasAudio(hasAudio);
#if ENABLE(DATACUE_VALUE)
if (hasMetaData)
@@ -1516,7 +1528,7 @@
setHasClosedCaptions(hasCaptions);
- LOG(Media, "WebCoreAVFMovieObserver:tracksChanged(%p) - hasVideo = %s, hasAudio = %s, hasCaptions = %s",
+ LOG(Media, "MediaPlayerPrivateAVFoundation:tracksChanged(%p) - hasVideo = %s, hasAudio = %s, hasCaptions = %s",
this, boolString(hasVideo()), boolString(hasAudio()), boolString(hasClosedCaptions()));
sizeChanged();
@@ -1571,12 +1583,28 @@
void MediaPlayerPrivateAVFoundationObjC::updateAudioTracks()
{
+#if !LOG_DISABLED
+ size_t count = m_audioTracks.size();
+#endif
+
determineChangedTracksFromNewTracksAndOldItems(m_cachedTracks.get(), AVMediaTypeAudio, m_audioTracks, &AudioTrackPrivateAVFObjC::create, player(), &MediaPlayer::removeAudioTrack, &MediaPlayer::addAudioTrack);
+
+#if !LOG_DISABLED
+ LOG(Media, "MediaPlayerPrivateAVFoundationObjC::updateAudioTracks(%p) - audio track count was %lu, is %lu", this, count, m_audioTracks.size());
+#endif
}
void MediaPlayerPrivateAVFoundationObjC::updateVideoTracks()
{
+#if !LOG_DISABLED
+ size_t count = m_videoTracks.size();
+#endif
+
determineChangedTracksFromNewTracksAndOldItems(m_cachedTracks.get(), AVMediaTypeVideo, m_videoTracks, &VideoTrackPrivateAVFObjC::create, player(), &MediaPlayer::removeVideoTrack, &MediaPlayer::addVideoTrack);
+
+#if !LOG_DISABLED
+ LOG(Media, "MediaPlayerPrivateAVFoundationObjC::updateVideoTracks(%p) - video track count was %lu, is %lu", this, count, m_videoTracks.size());
+#endif
}
bool MediaPlayerPrivateAVFoundationObjC::requiresTextTrackRepresentation() const
@@ -2311,6 +2339,20 @@
updateStates();
}
+void MediaPlayerPrivateAVFoundationObjC::firstFrameAvailableDidChange(bool isReady)
+{
+ m_cachedIsReadyForDisplay = isReady;
+ if (!hasVideo() && isReady)
+ tracksChanged();
+ updateStates();
+}
+
+void MediaPlayerPrivateAVFoundationObjC::trackEnabledDidChange(bool)
+{
+ tracksChanged();
+ updateStates();
+}
+
void MediaPlayerPrivateAVFoundationObjC::setShouldBufferData(bool shouldBuffer)
{
LOG(Media, "MediaPlayerPrivateAVFoundationObjC::shouldBufferData(%p) - %s", this, boolString(shouldBuffer));
@@ -2356,7 +2398,7 @@
{
m_currentMetaData = metadata && ![metadata isKindOfClass:[NSNull class]] ? metadata : nil;
- LOG(Media, "MediaPlayerPrivateAVFoundationObjC::metadataDidArrive(%p) - adding %i cues at time %.2f", this, m_currentMetaData ? [m_currentMetaData.get() count] : 0, mediaTime);
+ LOG(Media, "MediaPlayerPrivateAVFoundationObjC::metadataDidArrive(%p) - adding %i cues at time %.2f", this, m_currentMetaData ? static_cast<int>[m_currentMetaData.get() count] : 0, mediaTime);
#if ENABLE(DATACUE_VALUE)
if (seeking())
@@ -2396,7 +2438,13 @@
void MediaPlayerPrivateAVFoundationObjC::tracksDidChange(RetainPtr<NSArray> tracks)
{
+ for (AVPlayerItemTrack *track in m_cachedTracks.get())
+ [track removeObserver:m_objcObserver.get() forKeyPath:@"enabled"];
+
m_cachedTracks = tracks;
+ for (AVPlayerItemTrack *track in m_cachedTracks.get())
+ [track addObserver:m_objcObserver.get() forKeyPath:@"enabled" options:NSKeyValueObservingOptionNew context:(void *)MediaPlayerAVFoundationObservationContextPlayerItemTrack];
+
m_cachedTotalBytes = 0;
tracksChanged();
@@ -2481,7 +2529,7 @@
NSArray* assetTrackMetadataKeyNames()
{
- static NSArray* keys = [[NSArray alloc] initWithObjects:@"totalSampleDataLength", @"mediaType", nil];
+ static NSArray* keys = [[NSArray alloc] initWithObjects:@"totalSampleDataLength", @"mediaType", @"enabled", nil];
return keys;
}
@@ -2535,6 +2583,16 @@
WTF::Function<void ()> function;
+ if (context == MediaPlayerAVFoundationObservationContextAVPlayerLayer) {
+ if ([keyPath isEqualToString:@"readyForDisplay"])
+ function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::firstFrameAvailableDidChange, m_callback, [newValue boolValue]);
+ }
+
+ if (context == MediaPlayerAVFoundationObservationContextPlayerItemTrack) {
+ if ([keyPath isEqualToString:@"enabled"])
+ function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::trackEnabledDidChange, m_callback, [newValue boolValue]);
+ }
+
if (context == MediaPlayerAVFoundationObservationContextPlayerItem && willChange) {
if ([keyPath isEqualToString:@"playbackLikelyToKeepUp"])
function = WTF::bind(&MediaPlayerPrivateAVFoundationObjC::playbackLikelyToKeepUpWillChange, m_callback);
Modified: branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp (168822 => 168823)
--- branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp 2014-05-14 09:03:09 UTC (rev 168822)
+++ branches/safari-538.34-branch/Source/WebCore/platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp 2014-05-14 09:06:12 UTC (rev 168823)
@@ -45,7 +45,10 @@
void VideoTrackPrivateAVFObjC::resetPropertiesFromTrack()
{
- setSelected(m_impl->enabled());
+ // Don't call this->setSelected() because it also sets the enabled state of the
+ // AVPlayerItemTrack
+ VideoTrackPrivateAVF::setSelected(m_impl->enabled());
+
setKind(m_impl->videoKind());
setId(m_impl->id());
setLabel(m_impl->label());
_______________________________________________ webkit-changes mailing list [email protected] https://lists.webkit.org/mailman/listinfo/webkit-changes
