Title: [168823] branches/safari-538.34-branch/Source/WebCore

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

Reply via email to