# Copyright (C) 2020-2023 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
# THE POSSIBILITY OF SUCH DAMAGE.

#if ENABLE(GPU_PROCESS) && ENABLE(VIDEO)

[
    DispatchedFrom=WebContent,
    DispatchedTo=GPU,
    EnabledBy=UseGPUProcessForMediaEnabled
]
messages -> RemoteMediaPlayerProxy {
    PrepareForPlayback(bool privateMode, enum:uint8_t WebCore::MediaPlayerPreload preload, bool preservesPitch, enum:uint8_t WebCore::MediaPlayerPitchCorrectionAlgorithm pitchCorrectionAlgorithm, bool prepareToPlay, bool prepareForRendering, WebCore::IntSize presentationSize, float videoContentScale, bool isFullscreen, enum:uint8_t WebCore::DynamicRangeMode mode, WebCore::PlatformDynamicRangeLimit platformDynamicRangeLimit)

    Load(URL url, std::optional<WebKit::SandboxExtensionHandle> sandboxExtension, struct WebCore::MediaPlayerLoadOptions options) -> (struct WebKit::RemoteMediaPlayerConfiguration playerConfiguration)
#if ENABLE(MEDIA_SOURCE)
    [EnabledBy=MediaSourceEnabled || ManagedMediaSourceEnabled] LoadMediaSource(URL url, struct WebCore::MediaPlayerLoadOptions options, WebKit::RemoteMediaSourceIdentifier mediaSourceIdentifier) -> (struct WebKit::RemoteMediaPlayerConfiguration playerConfiguration)
#endif
    CancelLoad()

    PrepareToPlay()

    Play()
    Pause()

    SetVolumeLocked(bool volumeLocked)
    SetVolume(double volume)
    SetMuted(bool muted)

    SeekToTarget(struct WebCore::SeekTarget target)

    SetPreload(enum:uint8_t WebCore::MediaPlayerPreload preload)
    SetPrivateBrowsingMode(bool privateMode)
    SetPreservesPitch(bool preservesPitch)
    SetPitchCorrectionAlgorithm(enum:uint8_t WebCore::MediaPlayerPitchCorrectionAlgorithm algorithm)

    PrepareForRendering()
    SetPageIsVisible(bool visible)
    SetShouldMaintainAspectRatio(bool maintainAspectRatio)
    AcceleratedRenderingStateChanged(bool canBeAccelerated)
    SetShouldDisableSleep(bool disable)
    SetRate(double rate)
    DidLoadingProgress() -> (bool flag)

#if ENABLE(VIDEO_PRESENTATION_MODE)
    [EnabledBy=VideoPresentationManagerEnabled || VideoPresentationModeAPIEnabled] UpdateVideoFullscreenInlineImage()
    [EnabledBy=VideoPresentationManagerEnabled || VideoPresentationModeAPIEnabled] SetVideoFullscreenMode(WebCore::MediaPlayer::VideoFullscreenMode mode)
    [EnabledBy=VideoPresentationManagerEnabled || VideoPresentationModeAPIEnabled] SetVideoFullscreenGravity(enum:uint8_t WebCore::MediaPlayerVideoGravity gravity)
    [EnabledBy=VideoPresentationManagerEnabled || VideoPresentationModeAPIEnabled] VideoFullscreenStandbyChanged(bool standby)
#endif

    SetBufferingPolicy(enum:uint8_t WebCore::MediaPlayerBufferingPolicy policy)
    SetPresentationSize(WebCore::IntSize size)

#if PLATFORM(COCOA)
    SetVideoLayerSizeFenced(WebCore::FloatSize size, struct MachSendRightAnnotated sendRightAnnotated)
#endif

#if ENABLE(WIRELESS_PLAYBACK_TARGET)
    SetWirelessVideoPlaybackDisabled(bool disabled)
    SetWirelessPlaybackTarget(WebKit::MediaPlaybackTargetContextSerialized target)
    SetShouldPlayToPlaybackTarget(bool shouldPlay)
#endif

#if ENABLE(LEGACY_ENCRYPTED_MEDIA)
    [EnabledBy=LegacyEncryptedMediaAPIEnabled] SetLegacyCDMSession(std::optional<WebKit::RemoteLegacyCDMSessionIdentifier> instanceId)
    [EnabledBy=LegacyEncryptedMediaAPIEnabled] KeyAdded()
#endif

#if ENABLE(ENCRYPTED_MEDIA)
    [EnabledBy=EncryptedMediaAPIEnabled] CdmInstanceAttached(WebKit::RemoteCDMInstanceIdentifier instanceId)
    [EnabledBy=EncryptedMediaAPIEnabled] CdmInstanceDetached(WebKit::RemoteCDMInstanceIdentifier instanceId)
    [EnabledBy=EncryptedMediaAPIEnabled] AttemptToDecryptWithInstance(WebKit::RemoteCDMInstanceIdentifier instanceId)
#endif

#if ENABLE(LEGACY_ENCRYPTED_MEDIA) && ENABLE(ENCRYPTED_MEDIA)
    [EnabledBy=LegacyEncryptedMediaAPIEnabled] SetShouldContinueAfterKeyNeeded(bool should)
#endif

    NotifyActiveSourceBuffersChanged()

    ApplicationWillResignActive()
    ApplicationDidBecomeActive()

    NotifyTrackModeChanged()
    TracksChanged()

    AudioTrackSetEnabled(WebCore::TrackID trackId, bool enabled)
    VideoTrackSetSelected(WebCore::TrackID trackId, bool selected)
    TextTrackSetMode(WebCore::TrackID trackId, enum:uint8_t WebCore::InbandTextTrackPrivateMode mode)

    PerformTaskAtTime(MediaTime mediaTime) -> (std::optional<MediaTime> mediaTime)
    IsCrossOrigin(WebCore::SecurityOriginData origin) -> (std::optional<bool> crossOrigin) Synchronous

    SetVideoPlaybackMetricsUpdateInterval(double interval)

    SetPreferredDynamicRangeMode(enum:uint8_t WebCore::DynamicRangeMode mode)
    SetPlatformDynamicRangeLimit(WebCore::PlatformDynamicRangeLimit platformDynamicRangeLimit)

#if PLATFORM(IOS_FAMILY)
    ErrorLog() -> (String errorLog) Synchronous
    AccessLog() -> (String accessLog) Synchronous
    SetSceneIdentifier(String sceneIdentifier)
#endif

#if ENABLE(WEB_AUDIO)
    [EnabledBy=WebAudioEnabled] CreateAudioSourceProvider()
    [EnabledBy=WebAudioEnabled] SetShouldEnableAudioSourceProvider(bool shouldEnable)
#endif

#if PLATFORM(COCOA)
    NativeImageForCurrentTime() -> (std::optional<MachSendRight> sendRight, WebCore::DestinationColorSpace colorSpace) Synchronous
    ColorSpace() -> (WebCore::DestinationColorSpace colorSpace) Synchronous
#endif
    VideoFrameForCurrentTimeIfChanged() -> (struct std::optional<WebKit::RemoteVideoFrameProxyProperties> videoFrame, bool changed) Synchronous

    PlayAtHostTime(MonotonicTime time)
    PauseAtHostTime(MonotonicTime time)

    StartVideoFrameMetadataGathering()
    StopVideoFrameMetadataGathering()

    PlayerContentBoxRectChanged(WebCore::LayoutRect contentRect)

    SetShouldDisableHDR(bool shouldDisable)

    RequestHostingContext() -> (struct WebCore::HostingContext layerHostingContext)

    SetShouldCheckHardwareSupport(bool value)

#if HAVE(SPATIAL_TRACKING_LABEL)
    SetDefaultSpatialTrackingLabel(String defaultSpatialTrackingLabel);
    SetSpatialTrackingLabel(String spatialTrackingLabel);
#endif

#if HAVE(SPATIAL_AUDIO_EXPERIENCE)
    SetPrefersSpatialAudioExperience(bool value)
#endif

    AudioOutputDeviceChanged(String deviceId)
    IsInFullscreenOrPictureInPictureChanged(bool value)
    SetSoundStageSize(enum:uint8_t WebCore::MediaPlayerSoundStageSize value)

    SetHasMessageClientForTesting(bool value)
}

#endif
