Skip to content

Commit

Permalink
Cherry-pick 0ac4c71. rdar://123475213
Browse files Browse the repository at this point in the history
    Crash in fast/canvas/webgl/tex-image-and-uniform-binding test
    https://bugs.webkit.org/show_bug.cgi?id=268372
    rdar://121921205

    Reviewed by Youenn Fablet.

    It was possible for m_videoLayer to be set to zero before we accessed it in the VideoPlaybackQualityMetrics WorkQueue.

    * Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.h:
    * Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateAVFoundationObjC.mm:
    (WebCore::MediaPlayerPrivateAVFoundationObjC::createVideoLayer):
    (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayerLayer):
    (WebCore::MediaPlayerPrivateAVFoundationObjC::destroyVideoLayer):
    (WebCore::MediaPlayerPrivateAVFoundationObjC::createAVPlayer):
    (WebCore::MediaPlayerPrivateAVFoundationObjC::platformSetVisible):
    (WebCore::MediaPlayerPrivateAVFoundationObjC::updateVideoLayerGravity):
    (WebCore::MediaPlayerPrivateAVFoundationObjC::videoPlaybackQualityMetrics):
    (WebCore::MediaPlayerPrivateAVFoundationObjC::videoPlaybackQualityMetrics const):
    (WebCore::MediaPlayerPrivateAVFoundationObjC::asyncVideoPlaybackQualityMetrics):
    (WebCore::MediaPlayerPrivateAVFoundationObjC::setShouldDisableHDR):

    Canonical link: https://commits.webkit.org/273785@main

Identifier: 272448.617@safari-7618-branch
  • Loading branch information
jyavenard authored and MyahCobbs committed Feb 24, 2024
1 parent 7e4834d commit a72205e
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -368,10 +368,12 @@ class MediaPlayerPrivateAVFoundationObjC final : public MediaPlayerPrivateAVFoun
bool containsDisabledTracks() const;
bool trackIsPlayable(AVAssetTrack*) const;

std::optional<VideoPlaybackQualityMetrics> videoPlaybackQualityMetrics(AVPlayerLayer*) const;

RetainPtr<AVURLAsset> m_avAsset;
RetainPtr<AVPlayer> m_avPlayer;
RetainPtr<AVPlayerItem> m_avPlayerItem;
RetainPtr<AVPlayerLayer> m_videoLayer;
RetainPtr<AVPlayerLayer> m_videoLayer WTF_GUARDED_BY_CAPABILITY(mainThread);
std::unique_ptr<VideoLayerManagerObjC> m_videoLayerManager;
MediaPlayer::VideoGravity m_videoFullscreenGravity { MediaPlayer::VideoGravity::ResizeAspect };
RetainPtr<WebCoreAVFMovieObserver> m_objcObserver;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -613,6 +613,8 @@ static WallTime toSystemClockTime(NSDate *date)
return;

ensureOnMainThread([this, weakThis = ThreadSafeWeakPtr { *this }] {
assertIsMainThread();

RefPtr protectedThis = weakThis.get();
if (!protectedThis)
return;
Expand All @@ -631,6 +633,8 @@ static WallTime toSystemClockTime(NSDate *date)

void MediaPlayerPrivateAVFoundationObjC::createAVPlayerLayer()
{
assertIsMainThread();

if (!m_avPlayer)
return;

Expand Down Expand Up @@ -659,6 +663,8 @@ static WallTime toSystemClockTime(NSDate *date)

void MediaPlayerPrivateAVFoundationObjC::destroyVideoLayer()
{
assertIsMainThread();

if (!m_videoLayer)
return;

Expand Down Expand Up @@ -1082,6 +1088,8 @@ static URL conformFragmentIdentifierForURL(const URL& url)

void MediaPlayerPrivateAVFoundationObjC::createAVPlayer()
{
assertIsMainThread();

if (m_avPlayer)
return;

Expand Down Expand Up @@ -1353,6 +1361,8 @@ static URL conformFragmentIdentifierForURL(const URL& url)
void MediaPlayerPrivateAVFoundationObjC::setVideoFullscreenMode(MediaPlayer::VideoFullscreenMode mode)
{
#if PLATFORM(IOS_FAMILY) && !PLATFORM(WATCHOS)
assertIsMainThread();

if ([m_videoLayer respondsToSelector:@selector(setPIPModeEnabled:)])
[m_videoLayer setPIPModeEnabled:(mode & MediaPlayer::VideoFullscreenModePictureInPicture)];
updateDisableExternalPlayback();
Expand Down Expand Up @@ -1411,6 +1421,8 @@ static URL conformFragmentIdentifierForURL(const URL& url)

void MediaPlayerPrivateAVFoundationObjC::platformSetVisible(bool isVisible)
{
assertIsMainThread();

if (!m_videoLayer)
return;

Expand Down Expand Up @@ -2215,6 +2227,8 @@ static void fulfillRequestWithKeyData(AVAssetResourceLoadingRequest *request, Ar

void MediaPlayerPrivateAVFoundationObjC::updateVideoLayerGravity(ShouldAnimate shouldAnimate)
{
assertIsMainThread();

if (!m_videoLayer)
return;

Expand Down Expand Up @@ -3842,15 +3856,22 @@ void determineChangedTracksFromNewTracksAndOldItems(MediaSelectionGroupAVFObjC*

std::optional<VideoPlaybackQualityMetrics> MediaPlayerPrivateAVFoundationObjC::videoPlaybackQualityMetrics()
{
if (![m_videoLayer respondsToSelector:@selector(videoPerformanceMetrics)])
assertIsMainThread();

return videoPlaybackQualityMetrics(m_videoLayer.get());
}

std::optional<VideoPlaybackQualityMetrics> MediaPlayerPrivateAVFoundationObjC::videoPlaybackQualityMetrics(AVPlayerLayer* videoLayer) const
{
if (!videoLayer || ![videoLayer respondsToSelector:@selector(videoPerformanceMetrics)])
return std::nullopt;

#if PLATFORM(WATCHOS)
return std::nullopt;
#else
ALLOW_NEW_API_WITHOUT_GUARDS_BEGIN

auto metrics = [m_videoLayer videoPerformanceMetrics];
auto metrics = [videoLayer videoPerformanceMetrics];
if (!metrics)
return std::nullopt;

Expand All @@ -3872,14 +3893,20 @@ void determineChangedTracksFromNewTracksAndOldItems(MediaSelectionGroupAVFObjC*

auto MediaPlayerPrivateAVFoundationObjC::asyncVideoPlaybackQualityMetrics() -> Ref<VideoPlaybackQualityMetricsPromise>
{
assertIsMainThread();

static std::once_flag onceKey;
static LazyNeverDestroyed<Ref<WorkQueue>> metricsWorkQueue;
std::call_once(onceKey, [] {
metricsWorkQueue.construct(WorkQueue::create("VideoPlaybackQualityMetrics", WorkQueue::QOS::Background));
});

return invokeAsync(metricsWorkQueue.get(), [protectedThis = Ref { *this }, this] {
return MediaPlayerPrivateInterface::asyncVideoPlaybackQualityMetrics();
if (!m_videoLayer)
return VideoPlaybackQualityMetricsPromise::createAndReject(PlatformMediaError::NotSupportedError);
return invokeAsync(metricsWorkQueue.get(), [protectedThis = Ref { *this }, protectedVideoLayer = m_videoLayer, this] {
if (auto metrics = videoPlaybackQualityMetrics(protectedVideoLayer.get()))
return VideoPlaybackQualityMetricsPromise::createAndResolve(WTFMove(*metrics));
return VideoPlaybackQualityMetricsPromise::createAndReject(PlatformMediaError::NotSupportedError);
});
}

Expand Down Expand Up @@ -3927,6 +3954,8 @@ void determineChangedTracksFromNewTracksAndOldItems(MediaSelectionGroupAVFObjC*

void MediaPlayerPrivateAVFoundationObjC::setShouldDisableHDR(bool shouldDisable)
{
assertIsMainThread();

if (![m_videoLayer respondsToSelector:@selector(setToneMapToStandardDynamicRange:)])
return;

Expand Down

0 comments on commit a72205e

Please sign in to comment.