Title: [264710] trunk
Revision
264710
Author
jer.no...@apple.com
Date
2020-07-22 11:12:11 -0700 (Wed, 22 Jul 2020)

Log Message

[macOS] Adopt AVPlayer.videoRangeOverride
https://bugs.webkit.org/show_bug.cgi?id=213902
<rdar://problem/63953509>

Reviewed by Youenn Fablet.

Source/WebCore:

AVPlayer.videoRangeOverride and also +[AVPlayer preferredVideoRangeForDisplays:] are replacements for the
process-global MTShouldPlayHDR() and MTOverrideShouldPlayHDRVideo() and should be used preferentially if
present.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::createMediaPlayer):
(WebCore::HTMLMediaElement::setPreferredDynamicRangeMode):
* html/HTMLMediaElement.h:
* page/Page.cpp:
(WebCore::Page::screenPropertiesDidChange):
(WebCore::Page::windowScreenDidChange):
* page/Page.h:
* platform/PlatformScreen.h:
(WebCore::preferredDynamicRangeMode):
* platform/ScreenProperties.h:
(WebCore::ScreenData::encode const):
(WebCore::ScreenData::decode):
* platform/graphics/MediaPlayer.cpp:
(WebCore::MediaPlayer::setPreferredDynamicRangeMode):
* platform/graphics/MediaPlayer.h:
* platform/graphics/MediaPlayerPrivate.h:
(WebCore::MediaPlayerPrivateInterface::setPreferredDynamicRangeMode):
* platform/graphics/avfoundation/objc/CDMSessionAVStreamSession.mm:
(WebCore::CDMSessionAVStreamSession::update):
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
* platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
(WebCore::convertDynamicRangeModeEnumToAVVideoRange):
(WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayer):
(WebCore::MediaPlayerPrivateAVFoundationObjC::setPreferredDynamicRangeMode):
* platform/mac/PlatformScreenMac.mm:
(WebCore::convertAVVideoRangeToEnum):
(WebCore::collectScreenProperties):
(WebCore::preferredDynamicRangeMode):

Source/WebCore/PAL:

* pal/cocoa/AVFoundationSoftLink.h:
* pal/cocoa/AVFoundationSoftLink.mm:
* pal/spi/cocoa/AVFoundationSPI.h:

Source/WebKit:

* WebProcess/WebPage/WebPage.cpp:
(WebKit::WebPage::screenPropertiesDidChange):
* WebProcess/cocoa/WebProcessCocoa.mm:
(WebKit::WebProcess::updatePageScreenProperties):

Tools:

* TestWebKitAPI/Tests/WebCore/cocoa/AVFoundationSoftLinkTest.mm:
(TestWebKitAPI::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (264709 => 264710)


--- trunk/Source/WebCore/ChangeLog	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/ChangeLog	2020-07-22 18:12:11 UTC (rev 264710)
@@ -1,3 +1,45 @@
+2020-07-22  Jer Noble  <jer.no...@apple.com>
+
+        [macOS] Adopt AVPlayer.videoRangeOverride
+        https://bugs.webkit.org/show_bug.cgi?id=213902
+        <rdar://problem/63953509>
+
+        Reviewed by Youenn Fablet.
+
+        AVPlayer.videoRangeOverride and also +[AVPlayer preferredVideoRangeForDisplays:] are replacements for the
+        process-global MTShouldPlayHDR() and MTOverrideShouldPlayHDRVideo() and should be used preferentially if
+        present.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::createMediaPlayer):
+        (WebCore::HTMLMediaElement::setPreferredDynamicRangeMode):
+        * html/HTMLMediaElement.h:
+        * page/Page.cpp:
+        (WebCore::Page::screenPropertiesDidChange):
+        (WebCore::Page::windowScreenDidChange):
+        * page/Page.h:
+        * platform/PlatformScreen.h:
+        (WebCore::preferredDynamicRangeMode):
+        * platform/ScreenProperties.h:
+        (WebCore::ScreenData::encode const):
+        (WebCore::ScreenData::decode):
+        * platform/graphics/MediaPlayer.cpp:
+        (WebCore::MediaPlayer::setPreferredDynamicRangeMode):
+        * platform/graphics/MediaPlayer.h:
+        * platform/graphics/MediaPlayerPrivate.h:
+        (WebCore::MediaPlayerPrivateInterface::setPreferredDynamicRangeMode):
+        * platform/graphics/avfoundation/objc/CDMSessionAVStreamSession.mm:
+        (WebCore::CDMSessionAVStreamSession::update):
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
+        (WebCore::convertDynamicRangeModeEnumToAVVideoRange):
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayer):
+        (WebCore::MediaPlayerPrivateAVFoundationObjC::setPreferredDynamicRangeMode):
+        * platform/mac/PlatformScreenMac.mm:
+        (WebCore::convertAVVideoRangeToEnum):
+        (WebCore::collectScreenProperties):
+        (WebCore::preferredDynamicRangeMode):
+
 2020-07-22  Jon Davis  <j...@apple.com>
 
         Update status for Web App Manifest

Modified: trunk/Source/WebCore/PAL/ChangeLog (264709 => 264710)


--- trunk/Source/WebCore/PAL/ChangeLog	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/PAL/ChangeLog	2020-07-22 18:12:11 UTC (rev 264710)
@@ -1,3 +1,15 @@
+2020-07-22  Jer Noble  <jer.no...@apple.com>
+
+        [macOS] Adopt AVPlayer.videoRangeOverride
+        https://bugs.webkit.org/show_bug.cgi?id=213902
+        <rdar://problem/63953509>
+
+        Reviewed by Youenn Fablet.
+
+        * pal/cocoa/AVFoundationSoftLink.h:
+        * pal/cocoa/AVFoundationSoftLink.mm:
+        * pal/spi/cocoa/AVFoundationSPI.h:
+
 2020-07-21  Eric Carlson  <eric.carl...@apple.com>
 
         Use AVRoutePickerView when available for choosing AirPlay devices

Modified: trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.h (264709 => 264710)


--- trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.h	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.h	2020-07-22 18:12:11 UTC (rev 264710)
@@ -249,10 +249,11 @@
 SOFT_LINK_CONSTANT_FOR_HEADER(PAL, AVFoundation, AVMetadataKeySpaceHLSDateRange, NSString *)
 #define AVMetadataKeySpaceHLSDateRange PAL::get_AVFoundation_AVMetadataKeySpaceHLSDateRange()
 
-#if PLATFORM(MAC)
 SOFT_LINK_CONSTANT_FOR_HEADER(PAL, AVFoundation, AVStreamDataParserContentKeyRequestProtocolVersionsKey, NSString *)
-#define AVStreamDataParserContentKeyRequestProtocolVersionsKey PAL::get_AVFoundation_AVStreamDataParserContentKeyRequestProtocolVersionsKey()
-#endif
+SOFT_LINK_CONSTANT_MAY_FAIL_FOR_HEADER(PAL, AVFoundation, AVVideoRangeSDR, NSString *)
+SOFT_LINK_CONSTANT_MAY_FAIL_FOR_HEADER(PAL, AVFoundation, AVVideoRangeHLG, NSString *)
+SOFT_LINK_CONSTANT_MAY_FAIL_FOR_HEADER(PAL, AVFoundation, AVVideoRangeHDR10, NSString *)
+SOFT_LINK_CONSTANT_MAY_FAIL_FOR_HEADER(PAL, AVFoundation, AVVideoRangeDolbyVisionPQ, NSString *)
 
 #if PLATFORM(IOS_FAMILY)
 SOFT_LINK_CONSTANT_FOR_HEADER(PAL, AVFoundation, AVURLAssetBoundNetworkInterfaceName, NSString *)

Modified: trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.mm (264709 => 264710)


--- trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.mm	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.mm	2020-07-22 18:12:11 UTC (rev 264710)
@@ -199,6 +199,10 @@
 SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVURLAssetOutOfBandMIMETypeKey, NSString *, PAL_EXPORT)
 SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVURLAssetUseClientURLLoadingExclusively, NSString *, PAL_EXPORT)
 SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVVideoCodecTypeHEVCWithAlpha, NSString *, PAL_EXPORT)
+SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVVideoRangeSDR, NSString *, PAL_EXPORT)
+SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVVideoRangeHLG, NSString *, PAL_EXPORT)
+SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVVideoRangeHDR10, NSString *, PAL_EXPORT)
+SOFT_LINK_CONSTANT_MAY_FAIL_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVVideoRangeDolbyVisionPQ, NSString *, PAL_EXPORT)
 
 #if PLATFORM(IOS_FAMILY)
 SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, AVFoundation, AVAudioSessionCategoryAmbient, NSString *, PAL_EXPORT)

Modified: trunk/Source/WebCore/PAL/pal/spi/cocoa/AVFoundationSPI.h (264709 => 264710)


--- trunk/Source/WebCore/PAL/pal/spi/cocoa/AVFoundationSPI.h	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/PAL/pal/spi/cocoa/AVFoundationSPI.h	2020-07-22 18:12:11 UTC (rev 264710)
@@ -64,6 +64,12 @@
 @end
 NS_ASSUME_NONNULL_END
 
+typedef NSString * AVVideoRange NS_TYPED_ENUM;
+@interface AVPlayer (AVPlayerVideoRangeOverride)
+@property (nonatomic, copy, nullable) AVVideoRange videoRangeOverride;
++ (nullable AVVideoRange)preferredVideoRangeForDisplays:(nonnull NSArray <NSNumber *>*)displays;
+@end
+
 #if ENABLE(WIRELESS_PLAYBACK_TARGET) || PLATFORM(IOS_FAMILY)
 
 NS_ASSUME_NONNULL_BEGIN

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (264709 => 264710)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2020-07-22 18:12:11 UTC (rev 264710)
@@ -6532,6 +6532,7 @@
 
     m_player = MediaPlayer::create(*this);
     m_player->setBufferingPolicy(m_bufferingPolicy);
+    m_player->setPreferredDynamicRangeMode(preferredDynamicRangeMode(document().view()));
     schedulePlaybackControlsManagerUpdate();
 
 #if ENABLE(WEB_AUDIO)
@@ -6944,6 +6945,12 @@
     return emptyString();
 }
 
+void HTMLMediaElement::setPreferredDynamicRangeMode(DynamicRangeMode mode)
+{
+    if (m_player)
+        m_player->setPreferredDynamicRangeMode(mode);
+}
+
 Vector<String> HTMLMediaElement::mediaPlayerPreferredAudioCharacteristics() const
 {
     if (Page* page = document().page())

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (264709 => 264710)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2020-07-22 18:12:11 UTC (rev 264710)
@@ -96,6 +96,8 @@
 class VideoTrackPrivate;
 class WebKitMediaKeys;
 
+enum class DynamicRangeMode : uint8_t;
+
 template<typename> class DOMPromiseDeferred;
 template<typename, typename> class PODInterval;
 
@@ -575,6 +577,8 @@
     String mediaSessionTitle() const;
     String sourceApplicationIdentifier() const;
 
+    void setPreferredDynamicRangeMode(DynamicRangeMode);
+
 protected:
     HTMLMediaElement(const QualifiedName&, Document&, bool createdByParser);
     virtual void finishInitialization();

Modified: trunk/Source/WebCore/page/Page.cpp (264709 => 264710)


--- trunk/Source/WebCore/page/Page.cpp	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/page/Page.cpp	2020-07-22 18:12:11 UTC (rev 264710)
@@ -1157,6 +1157,18 @@
     pageOverlayController().didChangeDeviceScaleFactor();
 }
 
+void Page::screenPropertiesDidChange()
+{
+#if ENABLE(VIDEO)
+    auto mode = preferredDynamicRangeMode(mainFrame().view());
+    forEachMediaElement([mode] (auto& element) {
+        element.setPreferredDynamicRangeMode(mode);
+    });
+#endif
+
+    setNeedsRecalcStyleInAllFrames();
+}
+
 void Page::windowScreenDidChange(PlatformDisplayID displayID, Optional<unsigned> nominalFramesPerSecond)
 {
     if (displayID == m_displayID && nominalFramesPerSecond == m_displayNominalFramesPerSecond)
@@ -1170,6 +1182,13 @@
             frame->document()->windowScreenDidChange(displayID);
     }
 
+#if ENABLE(VIDEO)
+    auto mode = preferredDynamicRangeMode(mainFrame().view());
+    forEachMediaElement([mode] (auto& element) {
+        element.setPreferredDynamicRangeMode(mode);
+    });
+#endif
+
     if (m_scrollingCoordinator)
         m_scrollingCoordinator->windowScreenDidChange(displayID, nominalFramesPerSecond);
 

Modified: trunk/Source/WebCore/page/Page.h (264709 => 264710)


--- trunk/Source/WebCore/page/Page.h	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/page/Page.h	2020-07-22 18:12:11 UTC (rev 264710)
@@ -362,6 +362,7 @@
     float initialScaleIgnoringContentSize() const { return m_initialScaleIgnoringContentSize; }
     WEBCORE_EXPORT void setInitialScaleIgnoringContentSize(float);
 
+    WEBCORE_EXPORT void screenPropertiesDidChange();
     void windowScreenDidChange(PlatformDisplayID, Optional<unsigned> nominalFramesPerSecond);
     PlatformDisplayID displayID() const { return m_displayID; }
     Optional<unsigned> displayNominalFramesPerSecond() const { return m_displayNominalFramesPerSecond; }

Modified: trunk/Source/WebCore/platform/PlatformScreen.h (264709 => 264710)


--- trunk/Source/WebCore/platform/PlatformScreen.h	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/platform/PlatformScreen.h	2020-07-22 18:12:11 UTC (rev 264710)
@@ -29,6 +29,8 @@
 #include <wtf/Function.h>
 #endif
 
+#include <wtf/EnumTraits.h>
+
 #if PLATFORM(MAC)
 OBJC_CLASS NSScreen;
 OBJC_CLASS NSWindow;
@@ -79,6 +81,19 @@
 
 WEBCORE_EXPORT bool screenSupportsExtendedColor(Widget* = nullptr);
 
+enum class DynamicRangeMode : uint8_t {
+    None,
+    Standard,
+    HLG,
+    HDR10,
+    DolbyVisionPQ,
+};
+#if PLATFORM(MAC)
+WEBCORE_EXPORT DynamicRangeMode preferredDynamicRangeMode(Widget* = nullptr);
+#else
+constexpr DynamicRangeMode preferredDynamicRangeMode(Widget* = nullptr) { return DynamicRangeMode::Standard; }
+#endif
+
 #if PLATFORM(MAC) || PLATFORM(IOS_FAMILY)
 WEBCORE_EXPORT bool screenSupportsHighDynamicRange(Widget* = nullptr);
 #else
@@ -146,3 +161,18 @@
 #endif
 
 } // namespace WebCore
+
+namespace WTF {
+
+template<> struct EnumTraits<WebCore::DynamicRangeMode> {
+    using values = EnumValues<
+        WebCore::DynamicRangeMode,
+        WebCore::DynamicRangeMode::None,
+        WebCore::DynamicRangeMode::Standard,
+        WebCore::DynamicRangeMode::HLG,
+        WebCore::DynamicRangeMode::HDR10,
+        WebCore::DynamicRangeMode::DolbyVisionPQ
+    >;
+};
+
+} // namespace WTF

Modified: trunk/Source/WebCore/platform/ScreenProperties.h (264709 => 264710)


--- trunk/Source/WebCore/platform/ScreenProperties.h	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/platform/ScreenProperties.h	2020-07-22 18:12:11 UTC (rev 264710)
@@ -49,6 +49,7 @@
     bool screenIsMonochrome { false };
     uint32_t displayMask { 0 };
     IORegistryGPUID gpuID { 0 };
+    DynamicRangeMode preferredDynamicRangeMode { DynamicRangeMode::Standard };
 #endif
 
 #if PLATFORM(MAC) || PLATFORM(IOS_FAMILY)
@@ -99,7 +100,7 @@
     encoder << screenAvailableRect << screenRect << screenDepth << screenDepthPerComponent << screenSupportsExtendedColor << screenHasInvertedColors << screenSupportsHighDynamicRange;
 
 #if PLATFORM(MAC)
-    encoder << screenIsMonochrome << displayMask << gpuID;
+    encoder << screenIsMonochrome << displayMask << gpuID << preferredDynamicRangeMode;
 #endif
 
 #if PLATFORM(MAC) || PLATFORM(IOS_FAMILY)
@@ -182,6 +183,11 @@
     decoder >> gpuID;
     if (!gpuID)
         return WTF::nullopt;
+
+    Optional<DynamicRangeMode> preferredDynamicRangeMode;
+    decoder >> preferredDynamicRangeMode;
+    if (!preferredDynamicRangeMode)
+        return WTF::nullopt;
 #endif
 
 #if PLATFORM(MAC) || PLATFORM(IOS_FAMILY)
@@ -235,6 +241,7 @@
         WTFMove(*screenIsMonochrome),
         WTFMove(*displayMask),
         WTFMove(*gpuID),
+        WTFMove(*preferredDynamicRangeMode),
 #endif
 #if PLATFORM(MAC) || PLATFORM(IOS_FAMILY)
         WTFMove(*scaleFactor),

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp (264709 => 264710)


--- trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.cpp	2020-07-22 18:12:11 UTC (rev 264710)
@@ -1598,6 +1598,10 @@
     return client().documentSecurityOrigin();
 }
 
+void MediaPlayer::setPreferredDynamicRangeMode(DynamicRangeMode mode)
+{
+    m_private->setPreferredDynamicRangeMode(mode);
+}
 
 #if !RELEASE_LOG_DISABLED
 const Logger& MediaPlayer::mediaPlayerLogger()

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayer.h (264709 => 264710)


--- trunk/Source/WebCore/platform/graphics/MediaPlayer.h	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayer.h	2020-07-22 18:12:11 UTC (rev 264710)
@@ -37,6 +37,7 @@
 #include "PlatformLayer.h"
 #include "PlatformMediaResourceLoader.h"
 #include "PlatformMediaSession.h"
+#include "PlatformScreen.h"
 #include "SecurityOriginHash.h"
 #include "Timer.h"
 #include <wtf/URL.h>
@@ -627,6 +628,9 @@
 
     const MediaPlayerPrivateInterface* playerPrivate() const { return m_private.get(); }
 
+    DynamicRangeMode preferredDynamicRangeMode() const { return m_preferredDynamicRangeMode; }
+    void setPreferredDynamicRangeMode(DynamicRangeMode);
+
 private:
     MediaPlayer(MediaPlayerClient&);
     MediaPlayer(MediaPlayerClient&, MediaPlayerEnums::MediaEngineIdentifier);
@@ -656,6 +660,7 @@
     bool m_shouldPrepareToRender { false };
     bool m_contentMIMETypeWasInferredFromExtension { false };
     bool m_initializingMediaEngine { false };
+    DynamicRangeMode m_preferredDynamicRangeMode { DynamicRangeMode::Standard };
 
 #if ENABLE(MEDIA_SOURCE)
     RefPtr<MediaSourcePrivateClient> m_mediaSource;

Modified: trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h (264709 => 264710)


--- trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/platform/graphics/MediaPlayerPrivate.h	2020-07-22 18:12:11 UTC (rev 264710)
@@ -287,6 +287,8 @@
     virtual bool performTaskAtMediaTime(Function<void()>&&, const MediaTime&) { return false; }
 
     virtual bool shouldIgnoreIntrinsicSize() { return false; }
+
+    virtual void setPreferredDynamicRangeMode(DynamicRangeMode) { }
 };
 
 }

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVStreamSession.mm (264709 => 264710)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVStreamSession.mm	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/CDMSessionAVStreamSession.mm	2020-07-22 18:12:11 UTC (rev 264710)
@@ -227,7 +227,7 @@
 
         RetainPtr<NSDictionary> options;
         if (!m_protocolVersions.isEmpty()) {
-            options = @{ AVStreamDataParserContentKeyRequestProtocolVersionsKey: createNSArray(m_protocolVersions, [] (int version) -> NSNumber * {
+            options = @{ PAL::get_AVFoundation_AVStreamDataParserContentKeyRequestProtocolVersionsKey(): createNSArray(m_protocolVersions, [] (int version) -> NSNumber * {
                 return version ? @(version) : nil;
             }).get() };
         }

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h (264709 => 264710)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h	2020-07-22 18:12:11 UTC (rev 264710)
@@ -317,6 +317,8 @@
     bool performTaskAtMediaTime(Function<void()>&&, const MediaTime&) final;
     void setShouldObserveTimeControlStatus(bool);
 
+    void setPreferredDynamicRangeMode(DynamicRangeMode) final;
+
     RetainPtr<AVURLAsset> m_avAsset;
     RetainPtr<AVPlayer> m_avPlayer;
     RetainPtr<AVPlayerItem> m_avPlayerItem;

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm (264709 => 264710)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm	2020-07-22 18:12:11 UTC (rev 264710)
@@ -877,6 +877,25 @@
     });
 }
 
+static NSString* convertDynamicRangeModeEnumToAVVideoRange(DynamicRangeMode mode)
+{
+    switch (mode) {
+    case DynamicRangeMode::None:
+        return nil;
+    case DynamicRangeMode::Standard:
+        return PAL::canLoad_AVFoundation_AVVideoRangeSDR() ? PAL::get_AVFoundation_AVVideoRangeSDR() : nil;
+    case DynamicRangeMode::HLG:
+        return PAL::canLoad_AVFoundation_AVVideoRangeHLG() ? PAL::get_AVFoundation_AVVideoRangeHLG() : nil;
+    case DynamicRangeMode::HDR10:
+        return PAL::canLoad_AVFoundation_AVVideoRangeHDR10() ? PAL::get_AVFoundation_AVVideoRangeHDR10() : nil;
+    case DynamicRangeMode::DolbyVisionPQ:
+        return PAL::canLoad_AVFoundation_AVVideoRangeDolbyVisionPQ() ? PAL::get_AVFoundation_AVVideoRangeDolbyVisionPQ() : nil;
+    }
+
+    ASSERT_NOT_REACHED();
+    return nil;
+}
+
 void MediaPlayerPrivateAVFoundationObjC::createAVPlayer()
 {
     if (m_avPlayer)
@@ -892,7 +911,9 @@
 
     setShouldObserveTimeControlStatus(true);
 
-    [m_avPlayer.get() setAppliesMediaSelectionCriteriaAutomatically:NO];
+    m_avPlayer.get().appliesMediaSelectionCriteriaAutomatically = NO;
+    if ([m_avPlayer respondsToSelector:@selector(setVideoRangeOverride:)])
+        m_avPlayer.get().videoRangeOverride = convertDynamicRangeModeEnumToAVVideoRange(player()->preferredDynamicRangeMode());
 
 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
     updateDisableExternalPlayback();
@@ -3248,6 +3269,12 @@
     }
 }
 
+void MediaPlayerPrivateAVFoundationObjC::setPreferredDynamicRangeMode(DynamicRangeMode mode)
+{
+    if (m_avPlayer && [m_avPlayer respondsToSelector:@selector(setVideoRangeOverride:)])
+        m_avPlayer.get().videoRangeOverride = convertDynamicRangeModeEnumToAVVideoRange(mode);
+}
+
 NSArray* assetMetadataKeyNames()
 {
     static NSArray* keys = [[NSArray alloc] initWithObjects:

Modified: trunk/Source/WebCore/platform/mac/PlatformScreenMac.mm (264709 => 264710)


--- trunk/Source/WebCore/platform/mac/PlatformScreenMac.mm	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebCore/platform/mac/PlatformScreenMac.mm	2020-07-22 18:12:11 UTC (rev 264710)
@@ -34,8 +34,11 @@
 #import "ScreenProperties.h"
 #import <ColorSync/ColorSync.h>
 #import <pal/spi/cg/CoreGraphicsSPI.h>
+#import <pal/spi/cocoa/AVFoundationSPI.h>
 #import <wtf/ProcessPrivilege.h>
 
+#import <pal/cocoa/AVFoundationSoftLink.h>
+
 #if USE(MEDIATOOLBOX)
 #import <pal/cocoa/MediaToolboxSoftLink.h>
 #endif
@@ -95,6 +98,23 @@
     return screen(displayID(widget));
 }
 
+static DynamicRangeMode convertAVVideoRangeToEnum(NSString* range)
+{
+    if (!range)
+        return DynamicRangeMode::None;
+    if (PAL::canLoad_AVFoundation_AVVideoRangeSDR() && [range isEqualTo:PAL::get_AVFoundation_AVVideoRangeSDR()])
+        return DynamicRangeMode::Standard;
+    if (PAL::canLoad_AVFoundation_AVVideoRangeHLG() && [range isEqualTo:PAL::get_AVFoundation_AVVideoRangeHLG()])
+        return DynamicRangeMode::HLG;
+    if (PAL::canLoad_AVFoundation_AVVideoRangeHDR10() && [range isEqualTo:PAL::get_AVFoundation_AVVideoRangeHDR10()])
+        return DynamicRangeMode::HDR10;
+    if (PAL::canLoad_AVFoundation_AVVideoRangeDolbyVisionPQ() && [range isEqualTo:PAL::get_AVFoundation_AVVideoRangeDolbyVisionPQ()])
+        return DynamicRangeMode::DolbyVisionPQ;
+
+    ASSERT_NOT_REACHED();
+    return DynamicRangeMode::None;
+}
+
 ScreenProperties collectScreenProperties()
 {
     ASSERT(hasProcessPrivilege(ProcessPrivilege::CanCommunicateWithWindowServer));
@@ -118,16 +138,24 @@
         IORegistryGPUID gpuID = 0;
         bool screenSupportsHighDynamicRange = false;
         float scaleFactor = screen.backingScaleFactor;
+        DynamicRangeMode dynamicRangeMode = DynamicRangeMode::None;
 
+        if (PAL::isAVFoundationFrameworkAvailable() && [PAL::getAVPlayerClass() respondsToSelector:@selector(preferredVideoRangeForDisplays:)]) {
+            dynamicRangeMode = convertAVVideoRangeToEnum([PAL::getAVPlayerClass() preferredVideoRangeForDisplays:@[ @(displayID) ]]);
+            screenSupportsHighDynamicRange = dynamicRangeMode > DynamicRangeMode::Standard;
+        }
 #if USE(MEDIATOOLBOX)
-        if (PAL::isMediaToolboxFrameworkAvailable() && PAL::canLoad_MediaToolbox_MTShouldPlayHDRVideo())
+        else if (PAL::isMediaToolboxFrameworkAvailable() && PAL::canLoad_MediaToolbox_MTShouldPlayHDRVideo())
             screenSupportsHighDynamicRange = PAL::softLink_MediaToolbox_MTShouldPlayHDRVideo((__bridge CFArrayRef)@[ @(displayID) ]);
 #endif
 
+        if (!screenSupportsHighDynamicRange && dynamicRangeMode > DynamicRangeMode::Standard)
+            dynamicRangeMode = DynamicRangeMode::Standard;
+
         if (displayMask)
             gpuID = gpuIDForDisplayMask(displayMask);
 
-        screenProperties.screenDataMap.set(displayID, ScreenData { screenAvailableRect, screenRect, colorSpace, screenDepth, screenDepthPerComponent, screenSupportsExtendedColor, screenHasInvertedColors, screenSupportsHighDynamicRange, screenIsMonochrome, displayMask, gpuID, scaleFactor });
+        screenProperties.screenDataMap.set(displayID, ScreenData { screenAvailableRect, screenRect, colorSpace, screenDepth, screenDepthPerComponent, screenSupportsExtendedColor, screenHasInvertedColors, screenSupportsHighDynamicRange, screenIsMonochrome, displayMask, gpuID, dynamicRangeMode, scaleFactor });
 
         if (!screenProperties.primaryDisplayID)
             screenProperties.primaryDisplayID = displayID;
@@ -340,6 +368,20 @@
     return false;
 }
 
+DynamicRangeMode preferredDynamicRangeMode(Widget* widget)
+{
+    if (auto data = ""
+        return data->preferredDynamicRangeMode;
+
+    ASSERT(hasProcessPrivilege(ProcessPrivilege::CanCommunicateWithWindowServer));
+    if (PAL::isAVFoundationFrameworkAvailable() && [PAL::getAVPlayerClass() respondsToSelector:@selector(preferredVideoRangeForDisplays:)]) {
+        auto displayID = WebCore::displayID(screen(widget));
+        return convertAVVideoRangeToEnum([PAL::getAVPlayerClass() preferredVideoRangeForDisplays:@[ @(displayID) ]]);
+    }
+
+    return DynamicRangeMode::Standard;
+}
+
 FloatRect toUserSpace(const NSRect& rect, NSWindow *destination)
 {
     FloatRect userRect = rect;

Modified: trunk/Source/WebKit/ChangeLog (264709 => 264710)


--- trunk/Source/WebKit/ChangeLog	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebKit/ChangeLog	2020-07-22 18:12:11 UTC (rev 264710)
@@ -1,3 +1,16 @@
+2020-07-22  Jer Noble  <jer.no...@apple.com>
+
+        [macOS] Adopt AVPlayer.videoRangeOverride
+        https://bugs.webkit.org/show_bug.cgi?id=213902
+        <rdar://problem/63953509>
+
+        Reviewed by Youenn Fablet.
+
+        * WebProcess/WebPage/WebPage.cpp:
+        (WebKit::WebPage::screenPropertiesDidChange):
+        * WebProcess/cocoa/WebProcessCocoa.mm:
+        (WebKit::WebProcess::updatePageScreenProperties):
+
 2020-07-21  Simon Fraser  <simon.fra...@apple.com>
 
         Scrolling tesla.com on iPad is not smooth

Modified: trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp (264709 => 264710)


--- trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2020-07-22 18:12:11 UTC (rev 264710)
@@ -2141,7 +2141,7 @@
 
 void WebPage::screenPropertiesDidChange()
 {
-    m_page->setNeedsRecalcStyleInAllFrames();
+    m_page->screenPropertiesDidChange();
 }
 
 void WebPage::setUseFixedLayout(bool fixed)

Modified: trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm (264709 => 264710)


--- trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Source/WebKit/WebProcess/cocoa/WebProcessCocoa.mm	2020-07-22 18:12:11 UTC (rev 264710)
@@ -78,6 +78,7 @@
 #import <pal/spi/cf/CFNetworkSPI.h>
 #import <pal/spi/cf/CFUtilitiesSPI.h>
 #import <pal/spi/cg/CoreGraphicsSPI.h>
+#import <pal/spi/cocoa/AVFoundationSPI.h>
 #import <pal/spi/cocoa/CoreServicesSPI.h>
 #import <pal/spi/cocoa/LaunchServicesSPI.h>
 #import <pal/spi/cocoa/NSAccessibilitySPI.h>
@@ -133,6 +134,8 @@
 #import <os/state_private.h>
 #endif
 
+#import <pal/cocoa/AVFoundationSoftLink.h>
+
 SOFT_LINK_FRAMEWORK(CoreServices)
 SOFT_LINK_CLASS(CoreServices, _LSDService)
 SOFT_LINK_CLASS(CoreServices, _LSDOpenService)
@@ -1011,6 +1014,12 @@
 #if PLATFORM(MAC)
 void WebProcess::updatePageScreenProperties()
 {
+    // If AVPlayer.videoRangeOverride support is present, there's no need to override HDR mode
+    // at the MediaToolbox level, as the MediaToolbox override functionality is both duplicative
+    // and process global.
+    if (PAL::isAVFoundationFrameworkAvailable() && [PAL::getAVPlayerClass() instancesRespondToSelector:@selector(setVideoRangeOverride:)])
+        return;
+
     if (hasProcessPrivilege(ProcessPrivilege::CanCommunicateWithWindowServer)) {
         setShouldOverrideScreenSupportsHighDynamicRange(false, false);
         return;

Modified: trunk/Tools/ChangeLog (264709 => 264710)


--- trunk/Tools/ChangeLog	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Tools/ChangeLog	2020-07-22 18:12:11 UTC (rev 264710)
@@ -1,3 +1,14 @@
+2020-07-22  Jer Noble  <jer.no...@apple.com>
+
+        [macOS] Adopt AVPlayer.videoRangeOverride
+        https://bugs.webkit.org/show_bug.cgi?id=213902
+        <rdar://problem/63953509>
+
+        Reviewed by Youenn Fablet.
+
+        * TestWebKitAPI/Tests/WebCore/cocoa/AVFoundationSoftLinkTest.mm:
+        (TestWebKitAPI::TEST):
+
 2020-07-22  Jonathan Bedard  <jbed...@apple.com>
 
         [webkitpy] Remove version.py

Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/cocoa/AVFoundationSoftLinkTest.mm (264709 => 264710)


--- trunk/Tools/TestWebKitAPI/Tests/WebCore/cocoa/AVFoundationSoftLinkTest.mm	2020-07-22 18:00:35 UTC (rev 264709)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/cocoa/AVFoundationSoftLinkTest.mm	2020-07-22 18:12:11 UTC (rev 264710)
@@ -167,7 +167,7 @@
 #endif
 
 #if PLATFORM(MAC)
-    EXPECT_TRUE([AVStreamDataParserContentKeyRequestProtocolVersionsKey isEqualToString:@"AVContentKeyRequestProtocolVersionsKey"]);
+    EXPECT_TRUE([PAL::get_AVFoundation_AVStreamDataParserContentKeyRequestProtocolVersionsKey() isEqualToString:@"AVContentKeyRequestProtocolVersionsKey"]);
 #endif
 
 #if PLATFORM(IOS_FAMILY)
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to