/* * Copyright (c) 2024, Jamie Mansfield * Copyright (c) 2025, Psychpsyo * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include namespace Web::MediaCapabilitiesAPI { // https://w3c.github.io/media-capabilities/#dictdef-videoconfiguration struct VideoConfiguration { String content_type; WebIDL::UnsignedLong width; WebIDL::UnsignedLong height; Optional bitrate; double framerate; Optional has_alpha_channel; Optional hdr_metadata_type; Optional color_gamut; Optional transfer_function; Optional scalability_mode; Optional spatial_scalability; // https://w3c.github.io/media-capabilities/#valid-video-configuration bool is_valid_video_configuration() const; }; // https://w3c.github.io/media-capabilities/#dictdef-audioconfiguration struct AudioConfiguration { String content_type; Optional channels; Optional bitrate; Optional samplerate; Optional spatial_rendering; // https://w3c.github.io/media-capabilities/#valid-audio-configuration bool is_valid_audio_configuration() const; }; // https://w3c.github.io/media-capabilities/#dictdef-mediaconfiguration struct MediaConfiguration { Optional video; Optional audio; // https://w3c.github.io/media-capabilities/#valid-mediaconfiguration bool is_valid_media_configuration() const; }; // https://w3c.github.io/media-capabilities/#keysystemtrackconfiguration struct KeySystemTrackConfiguration { String robustness; Optional encryption_scheme; }; // https://w3c.github.io/media-capabilities/#mediacapabilitieskeysystemconfiguration struct MediaCapabilitiesKeySystemConfiguration { String key_system; String init_data_type; Bindings::MediaKeysRequirement distinctive_identifier; Bindings::MediaKeysRequirement persistent_state; Optional> session_types; Optional audio; Optional video; }; // https://w3c.github.io/media-capabilities/#dictdef-mediadecodingconfiguration struct MediaDecodingConfiguration : public MediaConfiguration { Bindings::MediaDecodingType type; Optional key_system_configuration; // https://w3c.github.io/media-capabilities/#valid-mediadecodingconfiguration bool is_valid_media_decoding_configuration() const; }; // https://w3c.github.io/media-capabilities/#dictdef-mediaencodingconfiguration struct MediaEncodingConfiguration : public MediaConfiguration { Bindings::MediaEncodingType type; }; // https://w3c.github.io/media-capabilities/#media-capabilities-info struct MediaCapabilitiesInfo { bool supported; bool smooth; bool power_efficient; }; // https://w3c.github.io/media-capabilities/#dictdef-mediacapabilitiesdecodinginfo struct MediaCapabilitiesDecodingInfo : public MediaCapabilitiesInfo { MediaDecodingConfiguration configuration; Optional key_system_configuration; GC::Ref to_object(JS::Realm&); }; struct MediaCapabilitiesEncodingInfo : public MediaCapabilitiesInfo { Optional configuration; }; // https://w3c.github.io/media-capabilities/#media-capabilities-interface class MediaCapabilities final : public Bindings::PlatformObject { WEB_PLATFORM_OBJECT(MediaCapabilities, Bindings::PlatformObject); GC_DECLARE_ALLOCATOR(MediaCapabilities); public: static GC::Ref create(JS::Realm&); virtual ~MediaCapabilities() override = default; // https://w3c.github.io/media-capabilities/#dom-mediacapabilities-decodinginfo GC::Ref decoding_info(MediaDecodingConfiguration const&); private: MediaCapabilities(JS::Realm&); virtual void initialize(JS::Realm&) override; // https://w3c.github.io/media-capabilities/#valid-mediadecodingconfiguration bool is_valid_media_decoding_configuration() const; }; // https://w3c.github.io/media-capabilities/#queue-a-media-capabilities-task void queue_a_media_capabilities_task(JS::VM& vm, Function); // https://w3c.github.io/media-capabilities/#create-a-mediacapabilitiesdecodinginfo MediaCapabilitiesDecodingInfo create_a_media_capabilities_decoding_info(MediaDecodingConfiguration); bool is_able_to_decode_media(MediaDecodingConfiguration configuration); // https://w3c.github.io/media-capabilities/#valid-audio-mime-type bool is_valid_audio_mime_type(StringView); // https://w3c.github.io/media-capabilities/#valid-video-mime-type bool is_valid_video_mime_type(StringView); }