⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 286908 in webkit


Ignore:
Timestamp:
Dec 11, 2021, 1:00:51 AM (5 years ago)
Author:
jer.noble@apple.com
Message:

Source/WebCore:
Add an experimental trackConfiguration accessor on AudioTrack & VideoTrack.
https://bugs.webkit.org/show_bug.cgi?id=230841

Reviewed by Eric Carlson.

Add an experimental property on AudioTrack VideoTrack which contains information about the
underlying media track's configuration. The AudioTrackConfiguration is based on
AudioConfiguration from MediaCapabilities. The VideoTrackConfiguration is based on a
combination of the VideoConfiguration from MediaCapabilities and the VideoColorSpace from
WebCodecs.

The AVFoundation implementation of AVTrackPrivateAVFObjCImpl will extract a NAL unit for the
video codec from the CMFormatDescription containing information about the underlying media,
and pass that NAL unit to utility methods in HEVCUtilities (which should probably be
renamed to CodecUntilities) to extract and create codec configuration strings. It will
extract colorspace information from CMFormatDescriptionExtensions found in the format
description. It will extract framerate, bitrate, width and height, sample rate and channel
count information from the underlying AVAssetTrack. There are shortcomings here, as HLS
streams and MSE streams do not generate framerate or bitrate information in the
AVAssetTrack.

Tests: media/track/audio-track-configuration.html

media/track/video-track-configuration.html

  • CMakeLists.txt:
  • DerivedSources-input.xcfilelist:
  • DerivedSources-output.xcfilelist:
  • DerivedSources.make:
  • Modules/webcodecs/VideoColorPrimaries.h:
  • Modules/webcodecs/VideoColorPrimaries.idl:
  • Modules/webcodecs/VideoColorSpace.h:

(WebCore::VideoColorSpace::create):
(WebCore::VideoColorSpace::primaries const):
(WebCore::VideoColorSpace::setPrimaries):
(WebCore::VideoColorSpace::transfer const):
(WebCore::VideoColorSpace::setTransfer):
(WebCore::VideoColorSpace::matrix const):
(WebCore::VideoColorSpace::setMatrix):
(WebCore::VideoColorSpace::fullRange const):
(WebCore::VideoColorSpace::setfFullRange):
(WebCore::VideoColorSpace::VideoColorSpace):

  • Modules/webcodecs/VideoColorSpace.idl:
  • Modules/webcodecs/VideoColorSpaceInit.h:
  • Modules/webcodecs/VideoColorSpaceInit.idl:
  • Modules/webcodecs/VideoMatrixCoefficients.h:
  • Modules/webcodecs/VideoMatrixCoefficients.idl:
  • Modules/webcodecs/VideoTransferCharacteristics.h:
  • Modules/webcodecs/VideoTransferCharacteristics.idl:
  • Sources.txt:
  • SourcesCocoa.txt:
  • WebCore.xcodeproj/project.pbxproj:
  • html/track/AudioTrack.cpp:

(WebCore::AudioTrack::AudioTrack):
(WebCore::AudioTrack::setPrivate):
(WebCore::AudioTrack::updateConfigurationFromPrivate):

  • html/track/AudioTrack.h:
  • html/track/AudioTrack.idl:
  • html/track/AudioTrackConfiguration.h:

(WebCore::AudioTrackConfiguration::create):
(WebCore::AudioTrackConfiguration::codec const):
(WebCore::AudioTrackConfiguration::setCodec):
(WebCore::AudioTrackConfiguration::sampleRate const):
(WebCore::AudioTrackConfiguration::setSampleRate):
(WebCore::AudioTrackConfiguration::numberOfChannels const):
(WebCore::AudioTrackConfiguration::setNumberOfChannels):
(WebCore::AudioTrackConfiguration::bitrate const):
(WebCore::AudioTrackConfiguration::setBitrate):
(WebCore::AudioTrackConfiguration::AudioTrackConfiguration):

  • html/track/AudioTrackConfiguration.idl:
  • html/track/VideoTrack.cpp:

(WebCore::VideoTrack::VideoTrack):
(WebCore::VideoTrack::setPrivate):
(WebCore::VideoTrack::updateConfigurationFromPrivate):

  • html/track/VideoTrack.h:
  • html/track/VideoTrack.idl:
  • html/track/VideoTrackConfiguration.h: Added.

(WebCore::VideoTrackConfiguration::create):
(WebCore::VideoTrackConfiguration::codec const):
(WebCore::VideoTrackConfiguration::setCodec):
(WebCore::VideoTrackConfiguration::width const):
(WebCore::VideoTrackConfiguration::setWidth):
(WebCore::VideoTrackConfiguration::height const):
(WebCore::VideoTrackConfiguration::setHeight):
(WebCore::VideoTrackConfiguration::colorSpace const):
(WebCore::VideoTrackConfiguration::setColorSpace):
(WebCore::VideoTrackConfiguration::framerate const):
(WebCore::VideoTrackConfiguration::setFramerate):
(WebCore::VideoTrackConfiguration::bitrate const):
(WebCore::VideoTrackConfiguration::setBitrate):
(WebCore::VideoTrackConfiguration::VideoTrackConfiguration):

  • html/track/VideoTrackConfiguration.idl:
  • platform/graphics/AudioTrackPrivate.h:

(WebCore::AudioTrackPrivate::codec const):
(WebCore::AudioTrackPrivate::setCodec):
(WebCore::AudioTrackPrivate::sampleRate const):
(WebCore::AudioTrackPrivate::setSampleRate):
(WebCore::AudioTrackPrivate::numberOfChannels const):
(WebCore::AudioTrackPrivate::setNumberOfChannels):
(WebCore::AudioTrackPrivate::bitrate const):
(WebCore::AudioTrackPrivate::setBitrate):

  • platform/graphics/HEVCUtilities.cpp:

(WebCore::parseAVCCodecParameters):
(WebCore::createAVCCodecParametersString):
(WebCore::parseAVCDecoderConfigurationRecord):
(WebCore::parseHEVCCodecParameters):
(WebCore::createHEVCCodecParametersString):
(WebCore::parseHEVCDecoderConfigurationRecord):
(WebCore::parseDoViDecoderConfigurationRecord):
(WebCore::createDoViCodecParametersString):

  • platform/graphics/HEVCUtilities.h:
  • platform/graphics/PlatformVideoColorPrimaries.h:
  • platform/graphics/PlatformVideoColorSpace.h:

(WebCore::PlatformVideoColorSpace::encode const):
(WebCore::PlatformVideoColorSpace::decode):

  • platform/graphics/PlatformVideoMatrixCoefficients.h:
  • platform/graphics/PlatformVideoTransferCharacteristics.h:
  • platform/graphics/VideoTrackPrivate.h:

(WebCore::VideoTrackPrivate::codec const):
(WebCore::VideoTrackPrivate::setCodec):
(WebCore::VideoTrackPrivate::width const):
(WebCore::VideoTrackPrivate::setWidth):
(WebCore::VideoTrackPrivate::height const):
(WebCore::VideoTrackPrivate::setHeight):
(WebCore::VideoTrackPrivate::colorSpace const):
(WebCore::VideoTrackPrivate::setColorSpace):
(WebCore::VideoTrackPrivate::framerate const):
(WebCore::VideoTrackPrivate::setFramerate):
(WebCore::VideoTrackPrivate::bitrate const):
(WebCore::VideoTrackPrivate::setBitrate):

  • platform/graphics/VideoTrackPrivateClient.h:
  • platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.h:
  • platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.mm:

(WebCore::assetTrackFor):
(WebCore::formatDescriptionFor):
(WebCore::AVTrackPrivateAVFObjCImpl::codec const):
(WebCore::AVTrackPrivateAVFObjCImpl::width const):
(WebCore::AVTrackPrivateAVFObjCImpl::height const):
(WebCore::AVTrackPrivateAVFObjCImpl::colorSpace const):
(WebCore::AVTrackPrivateAVFObjCImpl::framerate const):
(WebCore::AVTrackPrivateAVFObjCImpl::sampleRate const):
(WebCore::AVTrackPrivateAVFObjCImpl::numberOfChannels const):
(WebCore::AVTrackPrivateAVFObjCImpl::bitrate const):

  • platform/graphics/avfoundation/AudioTrackPrivateAVF.h:

(WebCore::AudioTrackPrivateAVF::kind const): Deleted.
(WebCore::AudioTrackPrivateAVF::id const): Deleted.
(WebCore::AudioTrackPrivateAVF::label const): Deleted.
(WebCore::AudioTrackPrivateAVF::language const): Deleted.
(WebCore::AudioTrackPrivateAVF::trackIndex const): Deleted.

  • platform/graphics/avfoundation/FormatDescriptionUtilities.cpp: Added.

(WebCore::presentationSizeFromFormatDescription):
(WebCore::colorSpaceFromFormatDescription):
(WebCore::codecFromFormatDescription):

  • platform/graphics/avfoundation/FormatDescriptionUtilities.h:
  • platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.h:
  • platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.mm:

(WebCore::MediaSelectionOptionAVFObjC::assetTrack const):

  • platform/graphics/avfoundation/VideoTrackPrivateAVF.h:
  • platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm:

(WebCore::AudioTrackPrivateAVFObjC::resetPropertiesFromTrack):

  • platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp:

(WebCore::VideoTrackPrivateAVFObjC::resetPropertiesFromTrack):

  • platform/graphics/avfoundation/objc/VideoTrackPrivateMediaSourceAVFObjC.mm:

(WebCore::VideoTrackPrivateMediaSourceAVFObjC::resetPropertiesFromTrack):

  • platform/graphics/cocoa/VideoTrackPrivateWebM.cpp:

(WebCore::VideoTrackPrivateWebM::codec const):
(WebCore::VideoTrackPrivateWebM::width const):
(WebCore::VideoTrackPrivateWebM::height const):
(WebCore::VideoTrackPrivateWebM::framerate const):

  • platform/graphics/cocoa/VideoTrackPrivateWebM.h:

Source/WebCore/PAL:
Add an experimental trackConfiguration accessor on AudioTrack & VideoTrack.
https://bugs.webkit.org/show_bug.cgi?id=230841

Reviewed by Eric Carlson.

  • pal/cf/CoreMediaSoftLink.cpp:
  • pal/cf/CoreMediaSoftLink.h:
  • pal/spi/cocoa/AVFoundationSPI.h:

Source/WebKit:
Add an experimental trackConfiguration accessor on AudioTrack & VideoTrack.
https://bugs.webkit.org/show_bug.cgi?id=230841

Reviewed by Eric Carlson.

  • GPUProcess/media/RemoteAudioTrackProxy.cpp:

(WebKit::RemoteAudioTrackProxy::configuration):

  • GPUProcess/media/RemoteAudioTrackProxy.h:
  • GPUProcess/media/RemoteVideoTrackProxy.cpp:

(WebKit::RemoteVideoTrackProxy::configuration):
(WebKit::RemoteVideoTrackProxy::updateConfiguration):
(WebKit::RemoteVideoTrackProxy::selectedChanged):
(WebKit::RemoteVideoTrackProxy::idChanged):
(WebKit::RemoteVideoTrackProxy::labelChanged):
(WebKit::RemoteVideoTrackProxy::languageChanged):
(WebKit::RemoteVideoTrackProxy::configurationChanged): Deleted.

  • GPUProcess/media/RemoteVideoTrackProxy.h:
  • GPUProcess/media/TrackPrivateRemoteConfiguration.h:

(WebKit::TrackPrivateRemoteConfiguration::encode const):
(WebKit::TrackPrivateRemoteConfiguration::decode):

  • WebProcess/GPU/media/AudioTrackPrivateRemote.cpp:

(WebKit::AudioTrackPrivateRemote::updateConfiguration):

  • WebProcess/GPU/media/AudioTrackPrivateRemote.h:
  • WebProcess/GPU/media/VideoTrackPrivateRemote.cpp:

(WebKit::VideoTrackPrivateRemote::updateConfiguration):

  • WebProcess/GPU/media/VideoTrackPrivateRemote.h:

Source/WTF:
Add an experimental VideoTrackConfiguration class and accessor on VideoTrack
https://bugs.webkit.org/show_bug.cgi?id=230841

Reviewed by Eric Carlson.

Drive-by change: add a Vector::reverseFindMatching convenience method.

  • Scripts/Preferences/WebPreferencesExperimental.yaml:
  • wtf/Vector.h:

(WTF::Malloc>::reverseFindMatching const):

LayoutTests:
Add an experimental trackConfiguration accessor on AudioTrack & VideoTrack.
https://bugs.webkit.org/show_bug.cgi?id=230841

Reviewed by Eric Carlson.

  • fast/mediastream/MediaStream-video-element-expected.txt:
  • media/content/test-hevc.mp4: Added.
  • media/hevc-codec-parameters-expected.txt:
  • media/hevc-codec-parameters.html:
  • media/hevc-codec-string-expected.txt: Added.
  • media/hevc-codec-string.html: Added.
  • media/track/audio-track-configuration-expected.txt: Added.
  • media/track/audio-track-configuration.html: Added.
  • media/track/video-track-configuration-expected.txt: Added.
  • media/track/video-track-configuration.html: Added.
Location:
trunk
Files:
11 added
56 edited
17 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r286906 r286908  
     12021-12-11  Jer Noble  <jer.noble@apple.com>
     2
     3        Add an experimental trackConfiguration accessor on AudioTrack & VideoTrack.
     4        https://bugs.webkit.org/show_bug.cgi?id=230841
     5
     6        Reviewed by Eric Carlson.
     7
     8        * fast/mediastream/MediaStream-video-element-expected.txt:
     9        * media/content/test-hevc.mp4: Added.
     10        * media/hevc-codec-parameters-expected.txt:
     11        * media/hevc-codec-parameters.html:
     12        * media/hevc-codec-string-expected.txt: Added.
     13        * media/hevc-codec-string.html: Added.
     14        * media/track/audio-track-configuration-expected.txt: Added.
     15        * media/track/audio-track-configuration.html: Added.
     16        * media/track/video-track-configuration-expected.txt: Added.
     17        * media/track/video-track-configuration.html: Added.
     18
    1192021-12-10  Myles C. Maxfield  <mmaxfield@apple.com>
    220
  • trunk/LayoutTests/fast/mediastream/MediaStream-video-element-expected.txt

    r286813 r286908  
    3232
    3333video.videoTracks[0] properties:
     34  configuration = [object VideoTrackConfiguration]
    3435  id = <UUID>
    3536  kind = main
     
    4546
    4647video.audioTracks[0] properties:
     48  configuration = [object AudioTrackConfiguration]
    4749  enabled = true
    4850  id = <UUID>
  • trunk/LayoutTests/media/hevc-codec-parameters-expected.txt

    r286813 r286908  
    11EXPECTED (internals.parseHEVCCodecParameters("bad-parameter") == 'null') OK
    22EXPECTED (internals.parseHEVCCodecParameters("hvc1") == 'null') OK
    3 EXPECTED (internals.parseHEVCCodecParameters("hev1.1.6.L93") === '{ 0, 1, 6, 93 }') OK
    4 EXPECTED (internals.parseHEVCCodecParameters("hev1.A4.41.H120") === '{ 1, 4, 65, 120 }') OK
    5 EXPECTED (internals.parseHEVCCodecParameters("hev1.B1.4.L63") === '{ 2, 1, 4, 63 }') OK
     3EXPECTED (internals.parseHEVCCodecParameters("hev1.1.6.L93") === '{ hev1, 0, 1, 1610612736, 0, [0,0,0,0,0,0], 93 }') OK
     4EXPECTED (internals.parseHEVCCodecParameters("hvc1.A4.41.H120") === '{ hvc1, 1, 4, 2181038080, 1, [0,0,0,0,0,0], 120 }') OK
     5EXPECTED (internals.parseHEVCCodecParameters("hev1.A4.41.H120.B0") === '{ hev1, 1, 4, 2181038080, 1, [176,0,0,0,0,0], 120 }') OK
     6EXPECTED (internals.parseHEVCCodecParameters("hvc1.B1.4.L63") === '{ hvc1, 2, 1, 536870912, 0, [0,0,0,0,0,0], 63 }') OK
    67EXPECTED (internals.parseHEVCCodecParameters("hev1.D1.4.L63") == 'null') OK
    78EXPECTED (internals.parseHEVCCodecParameters("hev1.B1.4.L68000") == 'null') OK
  • trunk/LayoutTests/media/hevc-codec-parameters.html

    r286813 r286908  
    55    <script>
    66    function HEVCParameterSetToString(set) {
    7         return `{ ${set.generalProfileSpace }, ${set.generalProfileIDC }, ${set.generalProfileCompatibilityFlags }, ${set.generalLevelIDC } }`;
     7        return `{ ${set.codec}, ${set.generalProfileSpace }, ${set.generalProfileIDC }, ${set.generalProfileCompatibilityFlags }, ${set.generalTierFlag}, [${set.generalConstraintIndicatorFlags}], ${set.generalLevelIDC } }`;
    88    }
    99    function isEqualHEVCParameterSet(setA, setB) {
    10         return setA.generalProfileSpace === setB.generalProfileSpace
     10        return setA.codec === setB.codec
     11            && setA.generalProfileSpace === setB.generalProfileSpace
    1112            && setA.generalProfileIDC === setB.generalProfileIDC
    1213            && setA.generalProfileCompatibilityFlags === setB.generalProfileCompatibilityFlags
     14            && setA.generalTierFlag === setB.generalTierFlag
    1315            && setA.generalLevelIDC === setB.generalLevelIDC
     16            && setA.generalConstraintIndicatorFlags[0] == setB.generalConstraintIndicatorFlags[0]
     17            && setA.generalConstraintIndicatorFlags[1] == setB.generalConstraintIndicatorFlags[1]
     18            && setA.generalConstraintIndicatorFlags[2] == setB.generalConstraintIndicatorFlags[2]
     19            && setA.generalConstraintIndicatorFlags[3] == setB.generalConstraintIndicatorFlags[3]
     20            && setA.generalConstraintIndicatorFlags[4] == setB.generalConstraintIndicatorFlags[4]
     21            && setA.generalConstraintIndicatorFlags[5] == setB.generalConstraintIndicatorFlags[5]
    1422    }
    15     function makeHEVCParameterSet(generalProfileSpace, generalProfileIDC, generalProfileCompatibilityFlags, generalLevelIDC)
     23    function makeHEVCParameterSet(codec, generalProfileSpace, generalProfileIDC, generalProfileCompatibilityFlags, generalTierFlag, generalConstraintIndicatorFlags, generalLevelIDC)
    1624    {
    1725        return {
     26            codec: codec,
    1827            generalProfileSpace: generalProfileSpace,
    1928            generalProfileIDC: generalProfileIDC,
    2029            generalProfileCompatibilityFlags: generalProfileCompatibilityFlags,
     30            generalTierFlag: generalTierFlag,
     31            generalConstraintIndicatorFlags: generalConstraintIndicatorFlags,
    2132            generalLevelIDC: generalLevelIDC,
    2233        };
     
    3142        testExpected('internals.parseHEVCCodecParameters("bad-parameter")', null);
    3243        testExpected('internals.parseHEVCCodecParameters("hvc1")', null);
    33         testExpectedHEVCParameterSet('internals.parseHEVCCodecParameters("hev1.1.6.L93")', makeHEVCParameterSet(0, 1, 6, 93));
    34         testExpectedHEVCParameterSet('internals.parseHEVCCodecParameters("hev1.A4.41.H120")', makeHEVCParameterSet(1, 4, 65, 120));
    35         testExpectedHEVCParameterSet('internals.parseHEVCCodecParameters("hev1.B1.4.L63")', makeHEVCParameterSet(2, 1, 4, 63));
     44        testExpectedHEVCParameterSet('internals.parseHEVCCodecParameters("hev1.1.6.L93")', makeHEVCParameterSet('hev1', 0, 1, 0x60000000, 0, [0, 0, 0, 0, 0, 0], 93));
     45        testExpectedHEVCParameterSet('internals.parseHEVCCodecParameters("hvc1.A4.41.H120")', makeHEVCParameterSet('hvc1', 1, 4, 0x82000000, 1, [0, 0, 0, 0, 0, 0], 120));
     46        testExpectedHEVCParameterSet('internals.parseHEVCCodecParameters("hev1.A4.41.H120.B0")', makeHEVCParameterSet('hev1', 1, 4, 0x82000000, 1, [176, 0, 0, 0, 0, 0], 120));
     47        testExpectedHEVCParameterSet('internals.parseHEVCCodecParameters("hvc1.B1.4.L63")', makeHEVCParameterSet('hvc1', 2, 1, 0x20000000, 0, [0, 0, 0, 0, 0, 0], 63));
    3648        testExpected('internals.parseHEVCCodecParameters("hev1.D1.4.L63")', null);
    3749        testExpected('internals.parseHEVCCodecParameters("hev1.B1.4.L68000")', null);
  • trunk/Source/WTF/ChangeLog

    r286893 r286908  
     12021-12-11  Jer Noble  <jer.noble@apple.com>
     2
     3        Add an experimental VideoTrackConfiguration class and accessor on VideoTrack
     4        https://bugs.webkit.org/show_bug.cgi?id=230841
     5
     6        Reviewed by Eric Carlson.
     7
     8        Drive-by change: add a Vector::reverseFindMatching convenience method.
     9
     10        * Scripts/Preferences/WebPreferencesExperimental.yaml:
     11        * wtf/Vector.h:
     12        (WTF::Malloc>::reverseFindMatching const):
     13
    1142021-12-10  Eric Carlson  <eric.carlson@apple.com>
    215
  • trunk/Source/WTF/Scripts/Preferences/WebPreferencesExperimental.yaml

    r286893 r286908  
    13621362      default: true
    13631363
     1364TrackConfigurationEnabled:
     1365  type: bool
     1366  humanReadableName: "Track Configuration API"
     1367  humanReadableDescription: "Track Configuration API"
     1368  defaultValue:
     1369    WebKitLegacy:
     1370      default: false
     1371    WebKit:
     1372      default: false
     1373    WebCore:
     1374      default: false
     1375
    13641376TransformStreamAPIEnabled:
    13651377  type: bool
  • trunk/Source/WTF/wtf/Vector.h

    r286815 r286908  
    759759    template<typename MatchFunction> size_t findMatching(const MatchFunction&) const;
    760760    template<typename U> size_t reverseFind(const U&) const;
    761    
     761    template<typename MatchFunction> size_t reverseFindMatching(const MatchFunction&) const;
     762
    762763    template<typename U> bool appendIfNotContains(const U&);
    763764
     
    10171018        const size_t index = size() - i;
    10181019        if (at(index) == value)
     1020            return index;
     1021    }
     1022    return notFound;
     1023}
     1024
     1025template<typename T, size_t inlineCapacity, typename OverflowHandler, size_t minCapacity, typename Malloc>
     1026template<typename MatchFunction>
     1027size_t Vector<T, inlineCapacity, OverflowHandler, minCapacity, Malloc>::reverseFindMatching(const MatchFunction& matches) const
     1028{
     1029    for (size_t i = 1; i <= size(); ++i) {
     1030        const size_t index = size() - i;
     1031        if (matches(at(index)))
    10191032            return index;
    10201033    }
  • trunk/Source/WebCore/CMakeLists.txt

    r286813 r286908  
    6666    "${WEBCORE_DIR}/Modules/webauthn/cbor"
    6767    "${WEBCORE_DIR}/Modules/webauthn/fido"
     68    "${WEBCORE_DIR}/Modules/webcodecs"
    6869    "${WEBCORE_DIR}/Modules/webdatabase"
    6970    "${WEBCORE_DIR}/Modules/webdriver"
     
    660661    Modules/webauthn/PublicKeyCredentialType.idl
    661662    Modules/webauthn/UserVerificationRequirement.idl
     663
     664    Modules/webcodecs/VideoColorPrimaries.idl
     665    Modules/webcodecs/VideoColorSpace.idl
     666    Modules/webcodecs/VideoColorSpaceInit.idl
     667    Modules/webcodecs/VideoMatrixCoefficients.idl
     668    Modules/webcodecs/VideoTransferCharacteristics.idl
    662669
    663670    Modules/webdatabase/DOMWindow+WebDatabase.idl
     
    11141121
    11151122    html/track/AudioTrack.idl
     1123    html/track/AudioTrackConfiguration.idl
    11161124    html/track/AudioTrackList.idl
    11171125    html/track/DataCue.idl
     
    11261134    html/track/VTTRegionList.idl
    11271135    html/track/VideoTrack.idl
     1136    html/track/VideoTrackConfiguration.idl
    11281137    html/track/VideoTrackList.idl
    11291138
  • trunk/Source/WebCore/ChangeLog

    r286907 r286908  
     12021-12-11  Jer Noble  <jer.noble@apple.com>
     2
     3        Add an experimental trackConfiguration accessor on AudioTrack & VideoTrack.
     4        https://bugs.webkit.org/show_bug.cgi?id=230841
     5
     6        Reviewed by Eric Carlson.
     7
     8        Add an experimental property on AudioTrack VideoTrack which contains information about the
     9        underlying media track's configuration. The AudioTrackConfiguration is based on
     10        AudioConfiguration from MediaCapabilities. The VideoTrackConfiguration is based on a
     11        combination of the VideoConfiguration from MediaCapabilities and the VideoColorSpace from
     12        WebCodecs.
     13
     14        The AVFoundation implementation of AVTrackPrivateAVFObjCImpl will extract a NAL unit for the
     15        video codec from the CMFormatDescription containing information about the underlying media,
     16        and pass that NAL unit to utility methods in HEVCUtilities (which should probably be
     17        renamed to CodecUntilities) to extract and create codec configuration strings. It will
     18        extract colorspace information from CMFormatDescriptionExtensions found in the format
     19        description. It will extract framerate, bitrate, width and height, sample rate and channel
     20        count information from the underlying AVAssetTrack. There are shortcomings here, as HLS
     21        streams and MSE streams do not generate framerate or bitrate information in the
     22        AVAssetTrack.
     23
     24        Tests: media/track/audio-track-configuration.html
     25               media/track/video-track-configuration.html
     26
     27        * CMakeLists.txt:
     28        * DerivedSources-input.xcfilelist:
     29        * DerivedSources-output.xcfilelist:
     30        * DerivedSources.make:
     31        * Modules/webcodecs/VideoColorPrimaries.h:
     32        * Modules/webcodecs/VideoColorPrimaries.idl:
     33        * Modules/webcodecs/VideoColorSpace.h:
     34        (WebCore::VideoColorSpace::create):
     35        (WebCore::VideoColorSpace::primaries const):
     36        (WebCore::VideoColorSpace::setPrimaries):
     37        (WebCore::VideoColorSpace::transfer const):
     38        (WebCore::VideoColorSpace::setTransfer):
     39        (WebCore::VideoColorSpace::matrix const):
     40        (WebCore::VideoColorSpace::setMatrix):
     41        (WebCore::VideoColorSpace::fullRange const):
     42        (WebCore::VideoColorSpace::setfFullRange):
     43        (WebCore::VideoColorSpace::VideoColorSpace):
     44        * Modules/webcodecs/VideoColorSpace.idl:
     45        * Modules/webcodecs/VideoColorSpaceInit.h:
     46        * Modules/webcodecs/VideoColorSpaceInit.idl:
     47        * Modules/webcodecs/VideoMatrixCoefficients.h:
     48        * Modules/webcodecs/VideoMatrixCoefficients.idl:
     49        * Modules/webcodecs/VideoTransferCharacteristics.h:
     50        * Modules/webcodecs/VideoTransferCharacteristics.idl:
     51        * Sources.txt:
     52        * SourcesCocoa.txt:
     53        * WebCore.xcodeproj/project.pbxproj:
     54        * html/track/AudioTrack.cpp:
     55        (WebCore::AudioTrack::AudioTrack):
     56        (WebCore::AudioTrack::setPrivate):
     57        (WebCore::AudioTrack::updateConfigurationFromPrivate):
     58        * html/track/AudioTrack.h:
     59        * html/track/AudioTrack.idl:
     60        * html/track/AudioTrackConfiguration.h:
     61        (WebCore::AudioTrackConfiguration::create):
     62        (WebCore::AudioTrackConfiguration::codec const):
     63        (WebCore::AudioTrackConfiguration::setCodec):
     64        (WebCore::AudioTrackConfiguration::sampleRate const):
     65        (WebCore::AudioTrackConfiguration::setSampleRate):
     66        (WebCore::AudioTrackConfiguration::numberOfChannels const):
     67        (WebCore::AudioTrackConfiguration::setNumberOfChannels):
     68        (WebCore::AudioTrackConfiguration::bitrate const):
     69        (WebCore::AudioTrackConfiguration::setBitrate):
     70        (WebCore::AudioTrackConfiguration::AudioTrackConfiguration):
     71        * html/track/AudioTrackConfiguration.idl:
     72        * html/track/VideoTrack.cpp:
     73        (WebCore::VideoTrack::VideoTrack):
     74        (WebCore::VideoTrack::setPrivate):
     75        (WebCore::VideoTrack::updateConfigurationFromPrivate):
     76        * html/track/VideoTrack.h:
     77        * html/track/VideoTrack.idl:
     78        * html/track/VideoTrackConfiguration.h: Added.
     79        (WebCore::VideoTrackConfiguration::create):
     80        (WebCore::VideoTrackConfiguration::codec const):
     81        (WebCore::VideoTrackConfiguration::setCodec):
     82        (WebCore::VideoTrackConfiguration::width const):
     83        (WebCore::VideoTrackConfiguration::setWidth):
     84        (WebCore::VideoTrackConfiguration::height const):
     85        (WebCore::VideoTrackConfiguration::setHeight):
     86        (WebCore::VideoTrackConfiguration::colorSpace const):
     87        (WebCore::VideoTrackConfiguration::setColorSpace):
     88        (WebCore::VideoTrackConfiguration::framerate const):
     89        (WebCore::VideoTrackConfiguration::setFramerate):
     90        (WebCore::VideoTrackConfiguration::bitrate const):
     91        (WebCore::VideoTrackConfiguration::setBitrate):
     92        (WebCore::VideoTrackConfiguration::VideoTrackConfiguration):
     93        * html/track/VideoTrackConfiguration.idl:
     94        * platform/graphics/AudioTrackPrivate.h:
     95        (WebCore::AudioTrackPrivate::codec const):
     96        (WebCore::AudioTrackPrivate::setCodec):
     97        (WebCore::AudioTrackPrivate::sampleRate const):
     98        (WebCore::AudioTrackPrivate::setSampleRate):
     99        (WebCore::AudioTrackPrivate::numberOfChannels const):
     100        (WebCore::AudioTrackPrivate::setNumberOfChannels):
     101        (WebCore::AudioTrackPrivate::bitrate const):
     102        (WebCore::AudioTrackPrivate::setBitrate):
     103        * platform/graphics/HEVCUtilities.cpp:
     104        (WebCore::parseAVCCodecParameters):
     105        (WebCore::createAVCCodecParametersString):
     106        (WebCore::parseAVCDecoderConfigurationRecord):
     107        (WebCore::parseHEVCCodecParameters):
     108        (WebCore::createHEVCCodecParametersString):
     109        (WebCore::parseHEVCDecoderConfigurationRecord):
     110        (WebCore::parseDoViDecoderConfigurationRecord):
     111        (WebCore::createDoViCodecParametersString):
     112        * platform/graphics/HEVCUtilities.h:
     113        * platform/graphics/PlatformVideoColorPrimaries.h:
     114        * platform/graphics/PlatformVideoColorSpace.h:
     115        (WebCore::PlatformVideoColorSpace::encode const):
     116        (WebCore::PlatformVideoColorSpace::decode):
     117        * platform/graphics/PlatformVideoMatrixCoefficients.h:
     118        * platform/graphics/PlatformVideoTransferCharacteristics.h:
     119        * platform/graphics/VideoTrackPrivate.h:
     120        (WebCore::VideoTrackPrivate::codec const):
     121        (WebCore::VideoTrackPrivate::setCodec):
     122        (WebCore::VideoTrackPrivate::width const):
     123        (WebCore::VideoTrackPrivate::setWidth):
     124        (WebCore::VideoTrackPrivate::height const):
     125        (WebCore::VideoTrackPrivate::setHeight):
     126        (WebCore::VideoTrackPrivate::colorSpace const):
     127        (WebCore::VideoTrackPrivate::setColorSpace):
     128        (WebCore::VideoTrackPrivate::framerate const):
     129        (WebCore::VideoTrackPrivate::setFramerate):
     130        (WebCore::VideoTrackPrivate::bitrate const):
     131        (WebCore::VideoTrackPrivate::setBitrate):
     132        * platform/graphics/VideoTrackPrivateClient.h:
     133        * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.h:
     134        * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.mm:
     135        (WebCore::assetTrackFor):
     136        (WebCore::formatDescriptionFor):
     137        (WebCore::AVTrackPrivateAVFObjCImpl::codec const):
     138        (WebCore::AVTrackPrivateAVFObjCImpl::width const):
     139        (WebCore::AVTrackPrivateAVFObjCImpl::height const):
     140        (WebCore::AVTrackPrivateAVFObjCImpl::colorSpace const):
     141        (WebCore::AVTrackPrivateAVFObjCImpl::framerate const):
     142        (WebCore::AVTrackPrivateAVFObjCImpl::sampleRate const):
     143        (WebCore::AVTrackPrivateAVFObjCImpl::numberOfChannels const):
     144        (WebCore::AVTrackPrivateAVFObjCImpl::bitrate const):
     145        * platform/graphics/avfoundation/AudioTrackPrivateAVF.h:
     146        (WebCore::AudioTrackPrivateAVF::kind const): Deleted.
     147        (WebCore::AudioTrackPrivateAVF::id const): Deleted.
     148        (WebCore::AudioTrackPrivateAVF::label const): Deleted.
     149        (WebCore::AudioTrackPrivateAVF::language const): Deleted.
     150        (WebCore::AudioTrackPrivateAVF::trackIndex const): Deleted.
     151        * platform/graphics/avfoundation/FormatDescriptionUtilities.cpp: Added.
     152        (WebCore::presentationSizeFromFormatDescription):
     153        (WebCore::colorSpaceFromFormatDescription):
     154        (WebCore::codecFromFormatDescription):
     155        * platform/graphics/avfoundation/FormatDescriptionUtilities.h:
     156        * platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.h:
     157        * platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.mm:
     158        (WebCore::MediaSelectionOptionAVFObjC::assetTrack const):
     159        * platform/graphics/avfoundation/VideoTrackPrivateAVF.h:
     160        * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm:
     161        (WebCore::AudioTrackPrivateAVFObjC::resetPropertiesFromTrack):
     162        * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp:
     163        (WebCore::VideoTrackPrivateAVFObjC::resetPropertiesFromTrack):
     164        * platform/graphics/avfoundation/objc/VideoTrackPrivateMediaSourceAVFObjC.mm:
     165        (WebCore::VideoTrackPrivateMediaSourceAVFObjC::resetPropertiesFromTrack):
     166        * platform/graphics/cocoa/VideoTrackPrivateWebM.cpp:
     167        (WebCore::VideoTrackPrivateWebM::codec const):
     168        (WebCore::VideoTrackPrivateWebM::width const):
     169        (WebCore::VideoTrackPrivateWebM::height const):
     170        (WebCore::VideoTrackPrivateWebM::framerate const):
     171        * platform/graphics/cocoa/VideoTrackPrivateWebM.h:
     172
    11732021-12-11  Jer Noble  <jer.noble@apple.com>
    2174
  • trunk/Source/WebCore/DerivedSources-input.xcfilelist

    r286813 r286908  
    742742$(PROJECT_DIR)/Modules/webauthn/PublicKeyCredentialType.idl
    743743$(PROJECT_DIR)/Modules/webauthn/UserVerificationRequirement.idl
     744$(PROJECT_DIR)/Modules/webcodecs/VideoColorPrimaries.idl
     745$(PROJECT_DIR)/Modules/webcodecs/VideoColorSpace.idl
     746$(PROJECT_DIR)/Modules/webcodecs/VideoColorSpaceInit.idl
     747$(PROJECT_DIR)/Modules/webcodecs/VideoMatrixCoefficients.idl
     748$(PROJECT_DIR)/Modules/webcodecs/VideoTransferCharacteristics.idl
    744749$(PROJECT_DIR)/Modules/webdatabase/DOMWindow+WebDatabase.idl
    745750$(PROJECT_DIR)/Modules/webdatabase/Database.idl
     
    13311336$(PROJECT_DIR)/html/shadow/meterElementShadow.css
    13321337$(PROJECT_DIR)/html/track/AudioTrack.idl
     1338$(PROJECT_DIR)/html/track/AudioTrackConfiguration.idl
    13331339$(PROJECT_DIR)/html/track/AudioTrackList.idl
    13341340$(PROJECT_DIR)/html/track/DataCue.idl
     
    13431349$(PROJECT_DIR)/html/track/VTTRegionList.idl
    13441350$(PROJECT_DIR)/html/track/VideoTrack.idl
     1351$(PROJECT_DIR)/html/track/VideoTrackConfiguration.idl
    13451352$(PROJECT_DIR)/html/track/VideoTrackList.idl
    13461353$(PROJECT_DIR)/inspector/CommandLineAPIHost.idl
  • trunk/Source/WebCore/DerivedSources-output.xcfilelist

    r286813 r286908  
    225225$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSAudioTrack.cpp
    226226$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSAudioTrack.h
     227$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSAudioTrackConfiguration.cpp
     228$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSAudioTrackConfiguration.h
    227229$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSAudioTrackList.cpp
    228230$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSAudioTrackList.h
     
    26082610$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSValidityState.cpp
    26092611$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSValidityState.h
     2612$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoColorPrimaries.cpp
     2613$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoColorPrimaries.h
     2614$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoColorSpace.cpp
     2615$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoColorSpace.h
     2616$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoColorSpaceInit.cpp
     2617$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoColorSpaceInit.h
    26102618$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoConfiguration.cpp
    26112619$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoConfiguration.h
     
    26142622$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoFrameRequestCallback.cpp
    26152623$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoFrameRequestCallback.h
     2624$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoMatrixCoefficients.cpp
     2625$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoMatrixCoefficients.h
    26162626$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoPlaybackQuality.cpp
    26172627$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoPlaybackQuality.h
     
    26202630$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTrack.cpp
    26212631$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTrack.h
     2632$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTrackConfiguration.cpp
     2633$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTrackConfiguration.h
    26222634$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTrackList.cpp
    26232635$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTrackList.h
     2636$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTrackMediaSource.cpp
     2637$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTrackMediaSource.h
     2638$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTransferCharacteristics.cpp
     2639$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVideoTransferCharacteristics.h
    26242640$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVisibilityState.cpp
    26252641$(BUILT_PRODUCTS_DIR)/DerivedSources/WebCore/JSVisibilityState.h
  • trunk/Source/WebCore/DerivedSources.make

    r286813 r286908  
    638638    $(WebCore)/Modules/webauthn/PublicKeyCredentialType.idl \
    639639    $(WebCore)/Modules/webauthn/UserVerificationRequirement.idl \
     640        $(WebCore)/Modules/webcodecs/VideoColorPrimaries.idl \
     641        $(WebCore)/Modules/webcodecs/VideoColorSpace.idl \
     642        $(WebCore)/Modules/webcodecs/VideoColorSpaceInit.idl \
     643        $(WebCore)/Modules/webcodecs/VideoMatrixCoefficients.idl \
     644        $(WebCore)/Modules/webcodecs/VideoTransferCharacteristics.idl \
    640645    $(WebCore)/Modules/webdatabase/DOMWindow+WebDatabase.idl \
    641646    $(WebCore)/Modules/webdatabase/Database.idl \
     
    11681173    $(WebCore)/html/canvas/WebGLVertexArrayObjectOES.idl \
    11691174    $(WebCore)/html/track/AudioTrack.idl \
     1175    $(WebCore)/html/track/AudioTrackConfiguration.idl \
    11701176    $(WebCore)/html/track/AudioTrackList.idl \
    11711177    $(WebCore)/html/track/DataCue.idl \
     
    11801186    $(WebCore)/html/track/VTTRegionList.idl \
    11811187    $(WebCore)/html/track/VideoTrack.idl \
     1188        $(WebCore)/html/track/VideoTrackConfiguration.idl \
    11821189    $(WebCore)/html/track/VideoTrackList.idl \
    11831190    $(WebCore)/mathml/MathMLElement.idl \
  • trunk/Source/WebCore/Headers.cmake

    r286893 r286908  
    15261526    platform/graphics/PlatformTextTrack.h
    15271527    platform/graphics/PlatformTimeRanges.h
     1528    platform/graphics/PlatformVideoColorPrimaries.h
     1529    platform/graphics/PlatformVideoColorSpace.h
     1530    platform/graphics/PlatformVideoMatrixCoefficients.h
     1531    platform/graphics/PlatformVideoTransferCharacteristics.h
    15281532    platform/graphics/Region.h
    15291533    platform/graphics/RemoteGraphicsContextGLProxyBase.h
  • trunk/Source/WebCore/Modules/webcodecs/VideoColorPrimaries.h

    r286907 r286908  
    2828#if ENABLE(VIDEO)
    2929
    30 #include "TrackPrivateBaseClient.h"
     30#include "PlatformVideoColorPrimaries.h"
    3131
    3232namespace WebCore {
    3333
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
    37 };
     34using VideoColorPrimaries = PlatformVideoColorPrimaries;
    3835
    3936}
  • trunk/Source/WebCore/Modules/webcodecs/VideoColorPrimaries.idl

    r286907 r286908  
    2424 */
    2525
    26 #pragma once
    27 
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
    31 
    32 namespace WebCore {
    33 
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     26enum VideoColorPrimaries {
     27  "bt709",
     28  "bt470bg",
     29  "smpte170m"
    3730};
    38 
    39 }
    40 
    41 #endif
  • trunk/Source/WebCore/Modules/webcodecs/VideoColorSpace.idl

    r286907 r286908  
    2424 */
    2525
    26 #pragma once
     26[
     27    Conditional=VIDEO,
     28    Exposed=(Window,Worker),
     29    ImplementationLacksVTable,
     30]
     31interface VideoColorSpace {
     32  readonly attribute VideoColorPrimaries? primaries;
     33  readonly attribute VideoTransferCharacteristics? transfer;
     34  readonly attribute VideoMatrixCoefficients? matrix;
     35  readonly attribute boolean? fullRange;
    2736
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
    31 
    32 namespace WebCore {
    33 
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     37  [Default] object toJSON();
    3738};
    38 
    39 }
    40 
    41 #endif
  • trunk/Source/WebCore/Modules/webcodecs/VideoColorSpaceInit.h

    r286907 r286908  
    2828#if ENABLE(VIDEO)
    2929
    30 #include "TrackPrivateBaseClient.h"
     30#include "PlatformVideoColorSpace.h"
    3131
    3232namespace WebCore {
    3333
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
    37 };
     34using VideoColorSpaceInit = PlatformVideoColorSpace;
    3835
    3936}
  • trunk/Source/WebCore/Modules/webcodecs/VideoColorSpaceInit.idl

    r286907 r286908  
    2323 * THE POSSIBILITY OF SUCH DAMAGE.
    2424 */
    25 
    26 #pragma once
    27 
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
    31 
    32 namespace WebCore {
    33 
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     25[
     26    Conditional=VIDEO,
     27    JSGenerateToJSObject,
     28] dictionary VideoColorSpaceInit {
     29  VideoColorPrimaries primaries;
     30  VideoTransferCharacteristics transfer;
     31  VideoMatrixCoefficients matrix;
     32  boolean fullRange;
    3733};
    38 
    39 }
    40 
    41 #endif
  • trunk/Source/WebCore/Modules/webcodecs/VideoMatrixCoefficients.h

    r286907 r286908  
    2828#if ENABLE(VIDEO)
    2929
    30 #include "TrackPrivateBaseClient.h"
     30#include "PlatformVideoMatrixCoefficients.h"
    3131
    3232namespace WebCore {
    3333
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     34using VideoMatrixCoefficients = PlatformVideoMatrixCoefficients;
     35
    3736};
    3837
    39 }
    40 
    4138#endif
  • trunk/Source/WebCore/Modules/webcodecs/VideoMatrixCoefficients.idl

    r286907 r286908  
    2424 */
    2525
    26 #pragma once
    27 
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
    31 
    32 namespace WebCore {
    33 
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     26enum VideoMatrixCoefficients {
     27  "rgb",
     28  "bt709",
     29  "bt470bg",
     30  "smpte170m"
    3731};
    38 
    39 }
    40 
    41 #endif
  • trunk/Source/WebCore/Modules/webcodecs/VideoTransferCharacteristics.h

    r286907 r286908  
    2828#if ENABLE(VIDEO)
    2929
    30 #include "TrackPrivateBaseClient.h"
     30#include "PlatformVideoTransferCharacteristics.h"
    3131
    3232namespace WebCore {
    3333
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
    37 };
     34using VideoTransferCharacteristics = PlatformVideoTransferCharacteristics;
    3835
    3936}
  • trunk/Source/WebCore/Modules/webcodecs/VideoTransferCharacteristics.idl

    r286907 r286908  
    2424 */
    2525
    26 #pragma once
    27 
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
    31 
    32 namespace WebCore {
    33 
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     26enum VideoTransferCharacteristics {
     27  "bt709",
     28  "smpte170m",
     29  "iec61966-2-1"
    3730};
    38 
    39 }
    40 
    41 #endif
  • trunk/Source/WebCore/PAL/ChangeLog

    r286893 r286908  
     12021-12-11  Jer Noble  <jer.noble@apple.com>
     2
     3        Add an experimental trackConfiguration accessor on AudioTrack & VideoTrack.
     4        https://bugs.webkit.org/show_bug.cgi?id=230841
     5
     6        Reviewed by Eric Carlson.
     7
     8        * pal/cf/CoreMediaSoftLink.cpp:
     9        * pal/cf/CoreMediaSoftLink.h:
     10        * pal/spi/cocoa/AVFoundationSPI.h:
     11
    1122021-12-10  Eric Carlson  <eric.carlson@apple.com>
    213
  • trunk/Source/WebCore/PAL/pal/cf/CoreMediaSoftLink.cpp

    r286813 r286908  
    5252SOFT_LINK_FUNCTION_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, CMBlockBufferIsRangeContiguous, Boolean, (CMBlockBufferRef theBuffer, size_t offset, size_t length), (theBuffer, offset, length), PAL_EXPORT)
    5353SOFT_LINK_FUNCTION_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, CMBlockBufferReplaceDataBytes, OSStatus, (const void* sourceBytes, CMBlockBufferRef destinationBuffer, size_t offsetIntoDestination, size_t dataLength), (sourceBytes, destinationBuffer, offsetIntoDestination, dataLength), PAL_EXPORT)
     54SOFT_LINK_FUNCTION_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, CMFormatDescriptionGetExtension, CFPropertyListRef, (CMFormatDescriptionRef desc, CFStringRef extensionKey), (desc, extensionKey), PAL_EXPORT)
    5455SOFT_LINK_FUNCTION_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, CMFormatDescriptionGetExtensions, CFDictionaryRef, (CMFormatDescriptionRef desc), (desc), PAL_EXPORT)
    5556SOFT_LINK_FUNCTION_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, CMSampleBufferGetTypeID, CFTypeID, (void), (), PAL_EXPORT)
     
    8182
    8283SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms, CFStringRef, PAL_EXPORT)
     84SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionExtension_ColorPrimaries, CFStringRef, PAL_EXPORT)
    8385SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionColorPrimaries_DCI_P3, CFStringRef, PAL_EXPORT)
    8486SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionColorPrimaries_ITU_R_2020, CFStringRef, PAL_EXPORT)
     
    9193SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionTransferFunction_SMPTE_ST_428_1, CFStringRef, PAL_EXPORT)
    9294SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionYCbCrMatrix_ITU_R_2020, CFStringRef, PAL_EXPORT)
     95SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionColorPrimaries_ITU_R_709_2, CFStringRef, PAL_EXPORT)
     96SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionColorPrimaries_EBU_3213, CFStringRef, PAL_EXPORT)
     97SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionColorPrimaries_SMPTE_C, CFStringRef, PAL_EXPORT)
     98SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionExtension_TransferFunction, CFStringRef, PAL_EXPORT)
     99SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionTransferFunction_ITU_R_709_2, CFStringRef, PAL_EXPORT)
     100SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionExtension_YCbCrMatrix, CFStringRef, PAL_EXPORT)
     101SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCVImageBufferYCbCrMatrix_ITU_R_709_2, CFStringRef, PAL_EXPORT)
     102SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCVImageBufferYCbCrMatrix_ITU_R_601_4, CFStringRef, PAL_EXPORT)
     103SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMFormatDescriptionYCbCrMatrix_SMPTE_240M_1995, CFStringRef, PAL_EXPORT)
    93104
    94105SOFT_LINK_CONSTANT_FOR_SOURCE_WITH_EXPORT(PAL, CoreMedia, kCMTextMarkupAlignmentType_End, CFStringRef, PAL_EXPORT)
  • trunk/Source/WebCore/PAL/pal/cf/CoreMediaSoftLink.h

    r286813 r286908  
    5757SOFT_LINK_FUNCTION_FOR_HEADER(PAL, CoreMedia, CMFormatDescriptionGetExtensions, CFDictionaryRef, (CMFormatDescriptionRef desc), (desc))
    5858#define CMFormatDescriptionGetExtensions softLink_CoreMedia_CMFormatDescriptionGetExtensions
     59SOFT_LINK_FUNCTION_FOR_HEADER(PAL, CoreMedia, CMFormatDescriptionGetExtension, CFPropertyListRef, (CMFormatDescriptionRef desc, CFStringRef extensionKey), (desc, extensionKey))
     60#define CMFormatDescriptionGetExtension softLink_CoreMedia_CMFormatDescriptionGetExtension
    5961SOFT_LINK_FUNCTION_FOR_HEADER(PAL, CoreMedia, CMSampleBufferGetTypeID, CFTypeID, (void), ())
    6062#define CMSampleBufferGetTypeID softLink_CoreMedia_CMSampleBufferGetTypeID
     
    112114SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms, CFStringRef)
    113115#define kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms get_CoreMedia_kCMFormatDescriptionExtension_SampleDescriptionExtensionAtoms()
     116SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionExtension_ColorPrimaries, CFStringRef)
    114117SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionColorPrimaries_DCI_P3, CFStringRef)
    115118#define kCMFormatDescriptionColorPrimaries_DCI_P3 get_CoreMedia_kCMFormatDescriptionColorPrimaries_DCI_P3()
     
    132135SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionYCbCrMatrix_ITU_R_2020, CFStringRef)
    133136#define kCMFormatDescriptionYCbCrMatrix_ITU_R_2020 get_CoreMedia_kCMFormatDescriptionYCbCrMatrix_ITU_R_2020()
     137SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionColorPrimaries_ITU_R_709_2, CFStringRef)
     138SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionColorPrimaries_EBU_3213, CFStringRef)
     139SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionColorPrimaries_SMPTE_C, CFStringRef)
     140SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionExtension_TransferFunction, CFStringRef)
     141SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionTransferFunction_ITU_R_709_2, CFStringRef)
     142SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionExtension_YCbCrMatrix, CFStringRef)
     143SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCVImageBufferYCbCrMatrix_ITU_R_709_2, CFStringRef)
     144SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCVImageBufferYCbCrMatrix_ITU_R_601_4, CFStringRef)
     145SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMFormatDescriptionYCbCrMatrix_SMPTE_240M_1995, CFStringRef)
    134146
    135147SOFT_LINK_CONSTANT_FOR_HEADER(PAL, CoreMedia, kCMTextMarkupAlignmentType_End, CFStringRef)
  • trunk/Source/WebCore/PAL/pal/spi/cocoa/AVFoundationSPI.h

    r286813 r286908  
    3838#import <AVFoundation/AVAssetCache_Private.h>
    3939#import <AVFoundation/AVCaptureSession_Private.h>
     40#import <AVFoundation/AVMediaSelectionGroup_Private.h>
    4041#import <AVFoundation/AVOutputContext_Private.h>
    4142#import <AVFoundation/AVOutputDevice.h>
     
    204205
    205206#endif // ENABLE(MEDIA_SOURCE)
     207
     208#import <AVFoundation/AVMediaSelectionGroup.h>
     209NS_ASSUME_NONNULL_BEGIN
     210@interface AVMediaSelectionOption (AVMediaSelectionOption_Private)
     211@property (nonatomic, readonly) AVAssetTrack *track;
     212@end
     213NS_ASSUME_NONNULL_END
    206214
    207215#endif // USE(APPLE_INTERNAL_SDK)
  • trunk/Source/WebCore/Sources.txt

    r286842 r286908  
    28802880JSAudioTimestamp.cpp
    28812881JSAudioTrack.cpp
     2882JSAudioTrackConfiguration.cpp
    28822883JSAudioTrackList.cpp
    28832884JSAudioWorklet.cpp
     
    39473948JSVTTRegionList.cpp
    39483949JSValidityState.cpp
     3950JSVideoColorPrimaries.cpp
     3951JSVideoColorSpace.cpp
     3952JSVideoColorSpaceInit.cpp
    39493953JSVideoConfiguration.cpp
    39503954JSVideoFrameMetadata.cpp
    39513955JSVideoFrameRequestCallback.cpp
     3956JSVideoMatrixCoefficients.cpp
    39523957JSVideoPlaybackQuality.cpp
    39533958JSVideoTrack.cpp
     3959JSVideoTrackConfiguration.cpp
    39543960JSVideoTrackList.cpp
     3961JSVideoTransferCharacteristics.cpp
    39553962JSVisibilityState.cpp
    39563963JSVisualViewport.cpp
  • trunk/Source/WebCore/SourcesCocoa.txt

    r286893 r286908  
    290290platform/graphics/avfoundation/AudioSourceProviderAVFObjC.mm @no-unify
    291291platform/graphics/avfoundation/CDMPrivateMediaSourceAVFObjC.mm
     292platform/graphics/avfoundation/FormatDescriptionUtilities.cpp
    292293platform/graphics/avfoundation/ISOFairPlayStreamingPsshBox.cpp
    293294platform/graphics/avfoundation/InbandMetadataTextTrackPrivateAVF.cpp
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r286893 r286908  
    44174417                CD19FEA81F573972000C42FB /* ImageDecoder.h in Headers */ = {isa = PBXBuildFile; fileRef = CD19FEA61F573972000C42FB /* ImageDecoder.h */; settings = {ATTRIBUTES = (Private, ); }; };
    44184418                CD19FEAE1F574B6D000C42FB /* ImageDecoderAVFObjC.h in Headers */ = {isa = PBXBuildFile; fileRef = CD19FEAC1F574B6D000C42FB /* ImageDecoderAVFObjC.h */; settings = {ATTRIBUTES = (Private, ); }; };
     4419                CD1F9B01270020B700617EB6 /* PlatformVideoColorSpace.h in Headers */ = {isa = PBXBuildFile; fileRef = CD1F9AFA26FD385900617EB6 /* PlatformVideoColorSpace.h */; settings = {ATTRIBUTES = (Private, ); }; };
     4420                CD1F9B022700323D00617EB6 /* PlatformVideoColorPrimaries.h in Headers */ = {isa = PBXBuildFile; fileRef = CD1F9AFB26FD38C900617EB6 /* PlatformVideoColorPrimaries.h */; settings = {ATTRIBUTES = (Private, ); }; };
     4421                CD1F9B032700323D00617EB6 /* PlatformVideoMatrixCoefficients.h in Headers */ = {isa = PBXBuildFile; fileRef = CD1F9AFD26FD38CB00617EB6 /* PlatformVideoMatrixCoefficients.h */; settings = {ATTRIBUTES = (Private, ); }; };
     4422                CD1F9B042700323D00617EB6 /* PlatformVideoTransferCharacteristics.h in Headers */ = {isa = PBXBuildFile; fileRef = CD1F9AFC26FD38CA00617EB6 /* PlatformVideoTransferCharacteristics.h */; settings = {ATTRIBUTES = (Private, ); }; };
    44194423                CD1F9B14270235F700617EB6 /* VideoTrackPrivateClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD1F9B12270235F700617EB6 /* VideoTrackPrivateClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
    44204424                CD1F9B162702360F00617EB6 /* AudioTrackPrivateClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CD1F9B152702360E00617EB6 /* AudioTrackPrivateClient.h */; settings = {ATTRIBUTES = (Private, ); }; };
     
    1578115785                CD19FEAD1F574B6D000C42FB /* ImageDecoderAVFObjC.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ImageDecoderAVFObjC.mm; sourceTree = "<group>"; };
    1578215786                CD1E7346167BC78E009A885D /* TextTrackRepresentation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TextTrackRepresentation.cpp; sourceTree = "<group>"; };
     15787                CD1F9AE626FD1F7B00617EB6 /* VideoTrackConfiguration.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = VideoTrackConfiguration.idl; sourceTree = "<group>"; };
     15788                CD1F9AE726FD1F7B00617EB6 /* VideoTrackConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoTrackConfiguration.h; sourceTree = "<group>"; };
     15789                CD1F9AEB26FD20C600617EB6 /* VideoColorSpaceInit.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = VideoColorSpaceInit.idl; sourceTree = "<group>"; };
     15790                CD1F9AEC26FD20C600617EB6 /* VideoColorSpaceInit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoColorSpaceInit.h; sourceTree = "<group>"; };
     15791                CD1F9AEE26FD20ED00617EB6 /* VideoColorPrimaries.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = VideoColorPrimaries.idl; sourceTree = "<group>"; };
     15792                CD1F9AEF26FD20ED00617EB6 /* VideoColorPrimaries.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoColorPrimaries.h; sourceTree = "<group>"; };
     15793                CD1F9AF126FD211700617EB6 /* VideoMatrixCoefficients.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = VideoMatrixCoefficients.idl; sourceTree = "<group>"; };
     15794                CD1F9AF226FD211700617EB6 /* VideoMatrixCoefficients.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoMatrixCoefficients.h; sourceTree = "<group>"; };
     15795                CD1F9AF426FD215600617EB6 /* VideoColorSpace.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = VideoColorSpace.idl; sourceTree = "<group>"; };
     15796                CD1F9AF526FD215600617EB6 /* VideoColorSpace.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoColorSpace.h; sourceTree = "<group>"; };
     15797                CD1F9AF726FD2CAD00617EB6 /* VideoTransferCharacteristics.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = VideoTransferCharacteristics.idl; sourceTree = "<group>"; };
     15798                CD1F9AF826FD2CAD00617EB6 /* VideoTransferCharacteristics.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoTransferCharacteristics.h; sourceTree = "<group>"; };
     15799                CD1F9AFA26FD385900617EB6 /* PlatformVideoColorSpace.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformVideoColorSpace.h; sourceTree = "<group>"; };
     15800                CD1F9AFB26FD38C900617EB6 /* PlatformVideoColorPrimaries.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformVideoColorPrimaries.h; sourceTree = "<group>"; };
     15801                CD1F9AFC26FD38CA00617EB6 /* PlatformVideoTransferCharacteristics.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformVideoTransferCharacteristics.h; sourceTree = "<group>"; };
     15802                CD1F9AFD26FD38CB00617EB6 /* PlatformVideoMatrixCoefficients.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformVideoMatrixCoefficients.h; sourceTree = "<group>"; };
    1578315803                CD1F9B12270235F700617EB6 /* VideoTrackPrivateClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoTrackPrivateClient.h; sourceTree = "<group>"; };
    1578415804                CD1F9B152702360E00617EB6 /* AudioTrackPrivateClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioTrackPrivateClient.h; sourceTree = "<group>"; };
     
    1583915859                CD3E252118046BCD00E27F56 /* CSSGridTemplateAreasValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CSSGridTemplateAreasValue.cpp; sourceTree = "<group>"; };
    1584015860                CD3E252218046BCD00E27F56 /* CSSGridTemplateAreasValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CSSGridTemplateAreasValue.h; sourceTree = "<group>"; };
     15861                CD42053B272318B500B464D7 /* JSAudioTrackConfiguration.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSAudioTrackConfiguration.cpp; sourceTree = "<group>"; };
     15862                CD42053E272318C300B464D7 /* JSAudioTrackConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAudioTrackConfiguration.h; sourceTree = "<group>"; };
     15863                CD42053F272318E900B464D7 /* JSVideoTrackConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = JSVideoTrackConfiguration.h; sourceTree = "<group>"; };
     15864                CD420540272318E900B464D7 /* JSVideoTrackConfiguration.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSVideoTrackConfiguration.cpp; sourceTree = "<group>"; };
    1584115865                CD4AC5281496AE2F0087C4EF /* Composite.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = Composite.wav; path = platform/audio/resources/Composite.wav; sourceTree = SOURCE_ROOT; };
    1584215866                CD4E0AFA11F7BC27009D3811 /* fullscreen.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = fullscreen.css; sourceTree = "<group>"; };
     
    1609516119                CDD7089418359F6E002B3DC6 /* SampleMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SampleMap.cpp; sourceTree = "<group>"; };
    1609616120                CDD7089518359F6F002B3DC6 /* SampleMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SampleMap.h; sourceTree = "<group>"; };
     16121                CDD8D30D271E991700DAA256 /* AudioTrackConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioTrackConfiguration.h; sourceTree = "<group>"; };
     16122                CDD8D30E271E991700DAA256 /* AudioTrackConfiguration.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = AudioTrackConfiguration.idl; sourceTree = "<group>"; };
     16123                CDD8D310271F2C8D00DAA256 /* FormatDescriptionUtilities.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = FormatDescriptionUtilities.h; sourceTree = "<group>"; };
     16124                CDD8D311271F2C8D00DAA256 /* FormatDescriptionUtilities.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = FormatDescriptionUtilities.cpp; sourceTree = "<group>"; };
    1609716125                CDDC1E7918A952F30027A9D4 /* MediaSourcePrivateClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaSourcePrivateClient.h; sourceTree = "<group>"; };
    1609816126                CDDDEA222538CD8000A1300C /* MediaSession.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = MediaSession.idl; sourceTree = "<group>"; };
     
    1858118609                                CD318621199F1E2A0030A0F7 /* CDMPrivateMediaSourceAVFObjC.h */,
    1858218610                                CD318620199F1E2A0030A0F7 /* CDMPrivateMediaSourceAVFObjC.mm */,
     18611                                CDD8D311271F2C8D00DAA256 /* FormatDescriptionUtilities.cpp */,
     18612                                CDD8D310271F2C8D00DAA256 /* FormatDescriptionUtilities.h */,
    1858318613                                07E9E12F18F62B370011A3A4 /* InbandMetadataTextTrackPrivateAVF.cpp */,
    1858418614                                07E9E12D18F5E2760011A3A4 /* InbandMetadataTextTrackPrivateAVF.h */,
     
    2585225882                                FD315FA212B025B100C1A359 /* webaudio */,
    2585325883                                57D8462A1FEAF57F00CA3682 /* webauthn */,
     25884                                CD1F9AEA26FD20A600617EB6 /* webcodecs */,
    2585425885                                97BC69D51505F054001B74AC /* webdatabase */,
    2585525886                                996E59DA1DF00D45006612B9 /* webdriver */,
     
    2670626737                                BE8EF03E171C8FF9009B48C3 /* JSAudioTrack.cpp */,
    2670726738                                BE8EF03F171C8FF9009B48C3 /* JSAudioTrack.h */,
     26739                                CD42053B272318B500B464D7 /* JSAudioTrackConfiguration.cpp */,
     26740                                CD42053E272318C300B464D7 /* JSAudioTrackConfiguration.h */,
    2670826741                                BE8EF040171C8FF9009B48C3 /* JSAudioTrackList.cpp */,
    2670926742                                BE8EF041171C8FF9009B48C3 /* JSAudioTrackList.h */,
     
    2696827001                                BE8EF046171C9014009B48C3 /* JSVideoTrack.cpp */,
    2696927002                                BE8EF047171C9014009B48C3 /* JSVideoTrack.h */,
     27003                                CD420540272318E900B464D7 /* JSVideoTrackConfiguration.cpp */,
     27004                                CD42053F272318E900B464D7 /* JSVideoTrackConfiguration.h */,
    2697027005                                BE8EF048171C9014009B48C3 /* JSVideoTrackList.cpp */,
    2697127006                                BE8EF049171C9014009B48C3 /* JSVideoTrackList.h */,
     
    2791927954                                BE88E0CE1715D2A200658D98 /* AudioTrack.idl */,
    2792027955                                CD1F9B1927023A7600617EB6 /* AudioTrackClient.h */,
     27956                                CDD8D30D271E991700DAA256 /* AudioTrackConfiguration.h */,
     27957                                CDD8D30E271E991700DAA256 /* AudioTrackConfiguration.idl */,
    2792127958                                BE88E0CF1715D2A200658D98 /* AudioTrackList.cpp */,
    2792227959                                BE88E0D01715D2A200658D98 /* AudioTrackList.h */,
     
    2796428001                                BE88E0D41715D2A200658D98 /* VideoTrack.idl */,
    2796528002                                CD1F9B1727023A2900617EB6 /* VideoTrackClient.h */,
     28003                                CD1F9AE726FD1F7B00617EB6 /* VideoTrackConfiguration.h */,
     28004                                CD1F9AE626FD1F7B00617EB6 /* VideoTrackConfiguration.idl */,
    2796628005                                BE88E0D51715D2A200658D98 /* VideoTrackList.cpp */,
    2796728006                                BE88E0D61715D2A200658D98 /* VideoTrackList.h */,
     
    2879628835                                074E82B818A69F0E007EF54C /* PlatformTimeRanges.cpp */,
    2879728836                                074E82B918A69F0E007EF54C /* PlatformTimeRanges.h */,
     28837                                CD1F9AFB26FD38C900617EB6 /* PlatformVideoColorPrimaries.h */,
     28838                                CD1F9AFA26FD385900617EB6 /* PlatformVideoColorSpace.h */,
     28839                                CD1F9AFD26FD38CB00617EB6 /* PlatformVideoMatrixCoefficients.h */,
     28840                                CD1F9AFC26FD38CA00617EB6 /* PlatformVideoTransferCharacteristics.h */,
    2879828841                                BCAB417F13E356E800D8AAF3 /* Region.cpp */,
    2879928842                                BCAB418013E356E800D8AAF3 /* Region.h */,
     
    2992929972                        );
    2993029973                        path = ios;
     29974                        sourceTree = "<group>";
     29975                };
     29976                CD1F9AEA26FD20A600617EB6 /* webcodecs */ = {
     29977                        isa = PBXGroup;
     29978                        children = (
     29979                                CD1F9AEF26FD20ED00617EB6 /* VideoColorPrimaries.h */,
     29980                                CD1F9AEE26FD20ED00617EB6 /* VideoColorPrimaries.idl */,
     29981                                CD1F9AF526FD215600617EB6 /* VideoColorSpace.h */,
     29982                                CD1F9AF426FD215600617EB6 /* VideoColorSpace.idl */,
     29983                                CD1F9AEC26FD20C600617EB6 /* VideoColorSpaceInit.h */,
     29984                                CD1F9AEB26FD20C600617EB6 /* VideoColorSpaceInit.idl */,
     29985                                CD1F9AF226FD211700617EB6 /* VideoMatrixCoefficients.h */,
     29986                                CD1F9AF126FD211700617EB6 /* VideoMatrixCoefficients.idl */,
     29987                                CD1F9AF826FD2CAD00617EB6 /* VideoTransferCharacteristics.h */,
     29988                                CD1F9AF726FD2CAD00617EB6 /* VideoTransferCharacteristics.idl */,
     29989                        );
     29990                        path = webcodecs;
    2993129991                        sourceTree = "<group>";
    2993229992                };
     
    3628836348                                0F7D07331884C56C00B4AF86 /* PlatformTextTrack.h in Headers */,
    3628936349                                074E82BB18A69F0E007EF54C /* PlatformTimeRanges.h in Headers */,
     36350                                CD1F9B022700323D00617EB6 /* PlatformVideoColorPrimaries.h in Headers */,
     36351                                CD1F9B01270020B700617EB6 /* PlatformVideoColorSpace.h in Headers */,
     36352                                CD1F9B032700323D00617EB6 /* PlatformVideoMatrixCoefficients.h in Headers */,
     36353                                CD1F9B042700323D00617EB6 /* PlatformVideoTransferCharacteristics.h in Headers */,
    3629036354                                52B0D4BE1C57FD1E0077CE53 /* PlatformView.h in Headers */,
    3629136355                                95BA4FAD26D981AA002A0E62 /* PlatformViewController.h in Headers */,
  • trunk/Source/WebCore/html/track/AudioTrack.cpp

    r286813 r286908  
    3636
    3737#include "AudioTrackClient.h"
     38#include "AudioTrackConfiguration.h"
    3839#include "AudioTrackList.h"
    3940#include "AudioTrackPrivate.h"
     
    8283    , m_private(trackPrivate)
    8384    , m_enabled(trackPrivate.enabled())
     85    , m_configuration(AudioTrackConfiguration::create())
    8486{
    8587    m_private->setClient(*this);
    8688    updateKindFromPrivate();
     89    updateConfigurationFromPrivate();
    8790}
    8891
     
    106109
    107110    updateKindFromPrivate();
     111    updateConfigurationFromPrivate();
    108112    setId(m_private->id());
    109113}
     
    226230}
    227231
     232void AudioTrack::updateConfigurationFromPrivate()
     233{
     234    m_configuration->setCodec(m_private->codec());
     235    m_configuration->setSampleRate(m_private->sampleRate());
     236    m_configuration->setNumberOfChannels(m_private->numberOfChannels());
     237    m_configuration->setBitrate(m_private->bitrate());
     238}
     239
    228240#if !RELEASE_LOG_DISABLED
    229241void AudioTrack::setLogger(const Logger& logger, const void* logIdentifier)
  • trunk/Source/WebCore/html/track/AudioTrack.h

    r286813 r286908  
    3636
    3737class AudioTrackClient;
     38class AudioTrackConfiguration;
    3839class AudioTrackList;
    3940
     
    6667    void setLanguage(const AtomString&) final;
    6768
     69    AudioTrackConfiguration& configuration() const { return m_configuration; }
     70
    6871#if !RELEASE_LOG_DISABLED
    6972    void setLogger(const Logger&, const void*) final;
     
    8588
    8689    void updateKindFromPrivate();
     90    void updateConfigurationFromPrivate();
    8791
    8892#if !RELEASE_LOG_DISABLED
     
    9498    Ref<AudioTrackPrivate> m_private;
    9599    bool m_enabled { false };
     100   
     101    Ref<AudioTrackConfiguration> m_configuration;
    96102};
    97103
  • trunk/Source/WebCore/html/track/AudioTrack.idl

    r286813 r286908  
    3434    readonly attribute DOMString label;
    3535    [SettingsConditionallyReadWrite=MediaSourceEnabled] attribute DOMString language;
     36    [EnabledBySetting=TrackConfigurationEnabled] readonly attribute AudioTrackConfiguration configuration;
    3637
    3738    attribute boolean enabled;
  • trunk/Source/WebCore/html/track/AudioTrackConfiguration.h

    r286907 r286908  
    2828#if ENABLE(VIDEO)
    2929
    30 #include "TrackPrivateBaseClient.h"
     30#include <wtf/text/WTFString.h>
    3131
    3232namespace WebCore {
    3333
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
     34struct AudioTrackConfigurationInit {
     35    String codec;
     36    uint32_t sampleRate { 0 };
     37    uint32_t numberOfChannels { 0 };
     38    uint64_t bitrate { 0 };
     39};
     40
     41class AudioTrackConfiguration : public RefCounted<AudioTrackConfiguration> {
     42    WTF_MAKE_FAST_ALLOCATED;
    3543public:
    36     virtual void selectedChanged(bool) = 0;
     44    static Ref<AudioTrackConfiguration> create(AudioTrackConfigurationInit&& init) { return adoptRef(*new AudioTrackConfiguration(WTFMove(init))); }
     45    static Ref<AudioTrackConfiguration> create() { return adoptRef(*new AudioTrackConfiguration()); }
     46
     47    String codec() const { return m_state.codec; }
     48    void setCodec(String codec) { m_state.codec = codec; }
     49
     50    uint32_t sampleRate() const { return m_state.sampleRate; }
     51    void setSampleRate(uint32_t sampleRate) { m_state.sampleRate = sampleRate; }
     52
     53    uint32_t numberOfChannels() const { return m_state.numberOfChannels; }
     54    void setNumberOfChannels(uint32_t numberOfChannels) { m_state.numberOfChannels = numberOfChannels; }
     55
     56    uint64_t bitrate() const { return m_state.bitrate; }
     57    void setBitrate(uint64_t bitrate) { m_state.bitrate = bitrate; }
     58
     59private:
     60    AudioTrackConfiguration(AudioTrackConfigurationInit&& init)
     61        : m_state(init)
     62    {
     63    }
     64    AudioTrackConfiguration() = default;
     65
     66    AudioTrackConfigurationInit m_state;
    3767};
    3868
  • trunk/Source/WebCore/html/track/AudioTrackConfiguration.idl

    r286907 r286908  
    2323 * THE POSSIBILITY OF SUCH DAMAGE.
    2424 */
    25 
    26 #pragma once
    27 
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
    31 
    32 namespace WebCore {
    33 
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     25[
     26    Conditional=VIDEO,
     27    ImplementationLacksVTable,
     28    Exposed=(Window,Worker),
     29] interface AudioTrackConfiguration {
     30    readonly attribute DOMString codec;
     31    readonly attribute unsigned long sampleRate;
     32    readonly attribute unsigned long numberOfChannels;
     33    readonly attribute unsigned long long bitrate;
    3734};
    38 
    39 }
    40 
    41 #endif
  • trunk/Source/WebCore/html/track/VideoTrack.cpp

    r286813 r286908  
    3636
    3737#include "VideoTrackClient.h"
     38#include "VideoTrackConfiguration.h"
    3839#include "VideoTrackList.h"
    3940#include "VideoTrackPrivate.h"
     
    8586    : MediaTrackBase(context, MediaTrackBase::VideoTrack, trackPrivate.id(), trackPrivate.label(), trackPrivate.language())
    8687    , m_private(trackPrivate)
     88    , m_configuration(VideoTrackConfiguration::create())
    8789    , m_selected(trackPrivate.selected())
    8890{
    8991    m_private->setClient(*this);
    9092    updateKindFromPrivate();
     93    updateConfigurationFromPrivate();
    9194}
    9295
     
    110113    m_private->setSelected(m_selected);
    111114    updateKindFromPrivate();
     115    updateConfigurationFromPrivate();
    112116    setId(m_private->id());
    113117}
     
    257261}
    258262
     263void VideoTrack::updateConfigurationFromPrivate()
     264{
     265    m_configuration->setCodec(m_private->codec());
     266    m_configuration->setWidth(m_private->width());
     267    m_configuration->setHeight(m_private->height());
     268    m_configuration->setColorSpace(VideoColorSpace::create(m_private->colorSpace()));
     269    m_configuration->setFramerate(m_private->framerate());
     270    m_configuration->setBitrate(m_private->bitrate());
     271}
     272
    259273#if !RELEASE_LOG_DISABLED
    260274void VideoTrack::setLogger(const Logger& logger, const void* logIdentifier)
  • trunk/Source/WebCore/html/track/VideoTrack.h

    r286813 r286908  
    3838class VideoTrack;
    3939class VideoTrackClient;
     40class VideoTrackConfiguration;
    4041class VideoTrackList;
    4142class VideoTrackPrivate;
     
    6970    const MediaDescription& description() const;
    7071
     72    VideoTrackConfiguration& configuration() const { return m_configuration; }
     73
    7174    void setPrivate(VideoTrackPrivate&);
    7275#if !RELEASE_LOG_DISABLED
     
    8184    // VideoTrackPrivateClient
    8285    void selectedChanged(bool) final;
     86    void configurationChanged() final { updateConfigurationFromPrivate(); }
    8387
    8488    // TrackPrivateBaseClient
     
    9195
    9296    void updateKindFromPrivate();
     97    void updateConfigurationFromPrivate();
    9398
    9499#if !RELEASE_LOG_DISABLED
     
    99104    WeakHashSet<VideoTrackClient> m_clients;
    100105    Ref<VideoTrackPrivate> m_private;
     106    Ref<VideoTrackConfiguration> m_configuration;
    101107    bool m_selected { false };
    102108};
  • trunk/Source/WebCore/html/track/VideoTrack.idl

    r286813 r286908  
    3636    attribute boolean selected;
    3737
     38    [EnabledBySetting=TrackConfigurationEnabled] readonly attribute VideoTrackConfiguration configuration;
    3839};
  • trunk/Source/WebCore/html/track/VideoTrackConfiguration.idl

    r286907 r286908  
    2424 */
    2525
    26 #pragma once
    27 
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
    31 
    32 namespace WebCore {
    33 
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     26[
     27    Conditional=VIDEO,
     28    ImplementationLacksVTable,
     29    Exposed=(Window,Worker),
     30] interface VideoTrackConfiguration {
     31    readonly attribute DOMString codec;
     32    readonly attribute unsigned long width;
     33    readonly attribute unsigned long height;
     34    readonly attribute unsigned long long bitrate;
     35    readonly attribute double framerate;
     36    readonly attribute VideoColorSpace colorSpace;
    3737};
    38 
    39 }
    40 
    41 #endif
  • trunk/Source/WebCore/platform/graphics/AudioTrackPrivate.h

    r286813 r286908  
    6565    using EnabledChangedCallback = Function<void(AudioTrackPrivate&, bool enabled)>;
    6666    void setEnabledChangedCallback(EnabledChangedCallback&& callback) { m_enabledChangedCallback = WTFMove(callback); }
     67   
     68    String codec() const { return m_codec; }
     69    void setCodec(String&& codec) { m_codec = WTFMove(codec); }
     70   
     71    uint32_t sampleRate() const { return m_sampleRate; }
     72    void setSampleRate(uint32_t sampleRate) { m_sampleRate = sampleRate; }
     73   
     74    uint32_t numberOfChannels() const { return m_numberOfChannels; }
     75    void setNumberOfChannels(uint32_t numberOfChannels) { m_numberOfChannels = numberOfChannels; }
     76   
     77    uint64_t bitrate() const { return m_bitrate; }
     78    void setBitrate(uint64_t bitrate) { m_bitrate = bitrate; }
    6779
    6880#if !RELEASE_LOG_DISABLED
     
    7688    WeakPtr<AudioTrackPrivateClient> m_client;
    7789    bool m_enabled { false };
     90    String m_codec;
     91    uint32_t m_sampleRate { 0 };
     92    uint32_t m_numberOfChannels { 0 };
     93    uint64_t m_bitrate { 0 };
    7894    EnabledChangedCallback m_enabledChangedCallback;
    7995};
  • trunk/Source/WebCore/platform/graphics/HEVCUtilities.cpp

    r286813 r286908  
    2727#include "HEVCUtilities.h"
    2828
     29#include "FourCC.h"
     30#include "SharedBuffer.h"
     31#include <JavaScriptCore/DataView.h>
     32#include <wtf/HexNumber.h>
    2933#include <wtf/NeverDestroyed.h>
    3034#include <wtf/SortedArrayMap.h>
    3135#include <wtf/text/StringToIntegerConversion.h>
    3236
     37#if __has_include(<bmalloc/pas_utils.h>)
     38#include <bmalloc/pas_utils.h>
     39#endif
     40
    3341namespace WebCore {
     42
     43static inline uint32_t reverseBits(uint32_t value)
     44{
     45#if __has_include(<bmalloc/pas_utils.h>)
     46    return pas_reverse(value);
     47#else
     48    // From pas_reverse():
     49    value = ((value & 0xaaaaaaaa) >> 1) | ((value & 0x55555555) << 1);
     50    value = ((value & 0xcccccccc) >> 2) | ((value & 0x33333333) << 2);
     51    value = ((value & 0xf0f0f0f0) >> 4) | ((value & 0x0f0f0f0f) << 4);
     52    value = ((value & 0xff00ff00) >> 8) | ((value & 0x00ff00ff) << 8);
     53    return (value >> 16) | (value << 16);
     54#endif
     55}
     56
     57std::optional<AVCParameters> parseAVCCodecParameters(StringView codecString)
     58{
     59    // The format of the 'avc1' codec string is specified in ISO/IEC 14496-15:2014, Annex E2.
     60    StringView codecView(codecString);
     61    auto codecSplit = codecView.split('.');
     62    auto nextElement = codecSplit.begin();
     63    if (nextElement == codecSplit.end())
     64        return std::nullopt;
     65
     66    AVCParameters parameters;
     67
     68    // Codec identifier: legal values are specified in ISO/IEC 14496-15:2014, section 8:
     69    auto codecName = *nextElement;
     70    if (codecName != "avc1")
     71        return std::nullopt;
     72
     73    if (++nextElement == codecSplit.end())
     74        return std::nullopt;
     75
     76    // First element: profile_idc
     77    auto firstElement = *nextElement;
     78    if (!firstElement.length())
     79        return std::nullopt;
     80
     81    auto profileFlagsAndLevel = parseInteger<uint32_t>(*nextElement, 16);
     82    if (!profileFlagsAndLevel)
     83        return std::nullopt;
     84    parameters.profileIDC = (*profileFlagsAndLevel & 0xF00) >> 16;
     85    parameters.constraintsFlags = (*profileFlagsAndLevel & 0xF0) >> 8;
     86    parameters.levelIDC = *profileFlagsAndLevel & 0xF;
     87
     88    return parameters;
     89}
     90
     91String createAVCCodecParametersString(const AVCParameters& parameters)
     92{
     93    // The format of the 'avc1' codec string is specified in ISO/IEC 14496-15:2014, Annex E.2.
     94    return makeString("avc1."
     95        , hex(parameters.profileIDC, 2)
     96        , hex(parameters.constraintsFlags, 2)
     97        , hex(parameters.levelIDC, 2));
     98}
     99
     100std::optional<AVCParameters> parseAVCDecoderConfigurationRecord(const SharedBuffer& buffer)
     101{
     102    // ISO/IEC 14496-10:2014
     103    // 7.3.2.1.1 Sequence parameter set data syntax
     104
     105    // AVCDecoderConfigurationRecord is at a minimum 24 bytes long
     106    if (buffer.size() < 24)
     107        return std::nullopt;
     108
     109    // aligned(8) class AVCDecoderConfigurationRecord {
     110    //    unsigned int(8) configurationVersion = 1;
     111    //    unsigned int(8) AVCProfileIndication;
     112    //    unsigned int(8) profile_compatibility;
     113    //    unsigned int(8) AVCLevelIndication;
     114    //    ...
     115    AVCParameters parameters;
     116    auto arrayBuffer = buffer.tryCreateArrayBuffer();
     117    if (!arrayBuffer)
     118        return std::nullopt;
     119
     120    bool status = true;
     121    auto view = JSC::DataView::create(WTFMove(arrayBuffer), 0, buffer.size());
     122
     123    // Byte 0 is a version flag
     124    parameters.profileIDC = view->get<uint8_t>(1, false, &status);
     125    if (!status)
     126        return std::nullopt;
     127
     128    parameters.constraintsFlags = view->get<uint8_t>(2, false, &status);
     129    if (!status)
     130        return std::nullopt;
     131
     132    parameters.levelIDC = view->get<uint8_t>(3, false, &status);
     133    if (!status)
     134        return std::nullopt;
     135
     136    return parameters;
     137}
    34138
    35139std::optional<HEVCParameters> parseHEVCCodecParameters(StringView codecString)
     
    46150    // Codec identifier: legal values are specified in ISO/IEC 14496-15:2014, section 8:
    47151    auto codecName = *nextElement;
    48     if (codecName != "hvc1" && codecName != "hev1")
     152    if (codecName == "hvc1")
     153        parameters.codec = HEVCParameters::Codec::Hvc1;
     154    else if (codecName == "hev1")
     155        parameters.codec = HEVCParameters::Codec::Hev1;
     156    else
    49157        return std::nullopt;
    50158
     
    78186    if (!compatibilityFlags)
    79187        return std::nullopt;
    80     parameters.generalProfileCompatibilityFlags = *compatibilityFlags;
     188    parameters.generalProfileCompatibilityFlags = reverseBits(*compatibilityFlags);
    81189
    82190    if (++nextElement == codecSplit.end())
     
    89197    if (firstCharacter != 'L' && firstCharacter != 'H')
    90198        return std::nullopt;
     199    parameters.generalTierFlag = (firstCharacter == 'L' ? 0 : 1);
    91200
    92201    auto generalLevelIDC = parseInteger<uint8_t>(generalTier.substring(1));
     
    100209        if (++nextElement == codecSplit.end())
    101210            break;
    102         if (!parseInteger<uint8_t>(*nextElement, 16))
     211        auto flag = parseInteger<uint8_t>(*nextElement, 16);
     212        if (!flag)
    103213            return std::nullopt;
    104     }
     214        parameters.generalConstraintIndicatorFlags[i] = *flag;
     215    }
     216
     217    return parameters;
     218}
     219
     220String createHEVCCodecParametersString(const HEVCParameters& parameters)
     221{
     222    // The format of the 'hevc' codec string is specified in ISO/IEC 14496-15:2014, Annex E.3.
     223    char profileSpaceCharacter = 'A' + parameters.generalProfileSpace - 1;
     224
     225    String profileSpaceString;
     226    if (parameters.generalProfileSpace)
     227        profileSpaceString.append(profileSpaceCharacter);
     228
     229    // For the second parameter, from ISO/IEC 14496-15:2014, Annex E.3.
     230    // * the 32 bits of the general_profile_compatibility_flags, but in reverse bit order, i.e. with
     231    // general_profile_compatibility_flag[ 31 ] as the most significant bit, followed by, general_profile_compatibility_flag[ 30 ],
     232    // and down to general_profile_compatibility_flag[ 0 ] as the least significant bit, where general_profile_compatibility_flag[ i ]
     233    // for i in the range of 0 to 31, inclusive, are specified in ISO/IEC 23008‐2, encoded in hexadecimal (leading zeroes may be omitted)
     234    auto compatFlagParameter = hex(reverseBits(parameters.generalProfileCompatibilityFlags));
     235
     236    // * each of the 6 bytes of the constraint flags, starting from the byte containing the
     237    // general_progressive_source_flag, each encoded as a hexadecimal number, and the encoding
     238    // of each byte separated by a period; trailing bytes that are zero may be omitted.
     239    StringBuilder compatibilityFlags;
     240    auto lastFlagByte = parameters.generalConstraintIndicatorFlags.reverseFindMatching([] (auto& flag) { return flag; });
     241    for (size_t i = 0; lastFlagByte != notFound && i <= lastFlagByte; ++i) {
     242        compatibilityFlags.append('.');
     243        compatibilityFlags.append(hex(parameters.generalConstraintIndicatorFlags[i], 2));
     244    }
     245
     246    return makeString(parameters.codec == HEVCParameters::Codec::Hev1 ? "hev1" : "hvc1"
     247        , '.'
     248        , profileSpaceString
     249        , parameters.generalProfileIDC
     250        , '.'
     251        , compatFlagParameter
     252        , '.'
     253        , parameters.generalTierFlag ? 'H' : 'L'
     254        , parameters.generalLevelIDC
     255        , compatibilityFlags.toString());
     256}
     257
     258std::optional<HEVCParameters> parseHEVCDecoderConfigurationRecord(const FourCC& codecCode, const SharedBuffer& buffer)
     259{
     260    // ISO/IEC 14496-15:2014
     261    // 8.3.3.1 HEVC decoder configuration record
     262
     263    // HEVCDecoderConfigurationRecord is at a minimum 23 bytes long
     264    if (buffer.size() < 23)
     265        return std::nullopt;
     266
     267    HEVCParameters parameters;
     268    if (codecCode == FourCC('hev1'))
     269        parameters.codec = HEVCParameters::Codec::Hev1;
     270    else if (codecCode == FourCC('hvc1'))
     271        parameters.codec = HEVCParameters::Codec::Hvc1;
     272    else
     273        return std::nullopt;
     274
     275    // aligned(8) class HEVCDecoderConfigurationRecord {
     276    //    unsigned int(8)  configurationVersion = 1;
     277    //    unsigned int(2)  general_profile_space;
     278    //    unsigned int(1)  general_tier_flag;
     279    //    unsigned int(5)  general_profile_idc;
     280    //    unsigned int(32) general_profile_compatibility_flags;
     281    //    unsigned int(48) general_constraint_indicator_flags;
     282    //    unsigned int(8)  general_level_idc;
     283    //    ...
     284    auto arrayBuffer = buffer.tryCreateArrayBuffer();
     285    if (!arrayBuffer)
     286        return std::nullopt;
     287
     288    bool status = true;
     289    auto view = JSC::DataView::create(WTFMove(arrayBuffer), 0, buffer.size());
     290    uint32_t profileSpaceTierIDC = view->get<uint8_t>(1, false, &status);
     291    if (!status)
     292        return std::nullopt;
     293
     294    parameters.generalProfileSpace = (profileSpaceTierIDC & 0b11000000) >> 6;
     295    parameters.generalTierFlag = (profileSpaceTierIDC & 0b00100000) >> 5;
     296    parameters.generalProfileIDC = profileSpaceTierIDC & 0b00011111;
     297
     298    parameters.generalProfileCompatibilityFlags = view->get<uint32_t>(2, false, &status);
     299    if (!status)
     300        return std::nullopt;
     301
     302    for (unsigned i = 0; i < 6; ++i) {
     303        parameters.generalConstraintIndicatorFlags[i] = view->get<uint8_t>(6 + i, false, &status);
     304        if (!status)
     305            return std::nullopt;
     306    }
     307
     308    parameters.generalLevelIDC = view->get<uint8_t>(12, false, &status);
     309    if (!status)
     310        return std::nullopt;
    105311
    106312    return parameters;
     
    231437}
    232438
    233 }
     439std::optional<DoViParameters> parseDoViDecoderConfigurationRecord(const SharedBuffer& buffer)
     440{
     441    // The format of the DoVi Configuration Record is contained in "Dolby Vision Streams Within
     442    // the ISO Base Media File Format, Version 2.0"
     443
     444    // DoViDecoderConfigurationRecord is exacty 24 bytes long
     445    if (buffer.size() < 24)
     446        return std::nullopt;
     447
     448    // align (8) class DOVIDecoderConfigurationRecord
     449    // {
     450    //     unsigned int (8) dv_version_major;
     451    //     unsigned int (8) dv_version_minor;
     452    //     unsigned int (7) dv_profile;
     453    //     unsigned int (6) dv_level;
     454    //     bit (1) rpu_present_flag;
     455    //     bit (1) el_present_flag;
     456    //     bit (1) bl_present_flag;
     457    //     ...
     458    DoViParameters parameters;
     459    auto arrayBuffer = buffer.tryCreateArrayBuffer();
     460    if (!arrayBuffer)
     461        return std::nullopt;
     462
     463    bool status = true;
     464    auto view = JSC::DataView::create(WTFMove(arrayBuffer), 0, buffer.size());
     465
     466    auto profileLevelAndFlags = view->get<uint16_t>(2, false, &status);
     467    if (!status)
     468        return std::nullopt;
     469
     470    parameters.bitstreamProfileID = (profileLevelAndFlags & 0b1111111000000000) >> 9;
     471    parameters.bitstreamLevelID = (profileLevelAndFlags & 0b0000000111111000) >> 3;
     472    return parameters;
     473}
     474
     475String createDoViCodecParametersString(const DoViParameters& parameters)
     476{
     477    // The format of the DoVi codec string is specified in "Dolby Vision Profiles and Levels Version 1.3.2"
     478    StringBuilder builder;
     479    builder.append("dvh1.");
     480    if (parameters.bitstreamProfileID < 10)
     481        builder.append('0');
     482    builder.append(parameters.bitstreamProfileID);
     483    builder.append('.');
     484    if (parameters.bitstreamLevelID < 10)
     485        builder.append('0');
     486    builder.append(parameters.bitstreamLevelID);
     487    return builder.toString();
     488}
     489
     490}
  • trunk/Source/WebCore/platform/graphics/HEVCUtilities.h

    r286813 r286908  
    2828#include <optional>
    2929#include <wtf/Forward.h>
     30#include <wtf/Vector.h>
    3031
    3132namespace WebCore {
    3233
     34struct FourCC;
     35class SharedBuffer;
     36
     37struct AVCParameters {
     38    uint8_t profileIDC { 0 };
     39    uint8_t constraintsFlags { 0 };
     40    uint8_t levelIDC { 0 };
     41};
     42
     43WEBCORE_EXPORT std::optional<AVCParameters> parseAVCCodecParameters(StringView);
     44WEBCORE_EXPORT std::optional<AVCParameters> parseAVCDecoderConfigurationRecord(const SharedBuffer&);
     45WEBCORE_EXPORT String createAVCCodecParametersString(const AVCParameters&);
     46
    3347struct HEVCParameters {
     48    enum class Codec { Hev1, Hvc1 } codec { Codec::Hvc1 };
    3449    uint16_t generalProfileSpace { 0 };
    3550    uint16_t generalProfileIDC { 0 };
    3651    uint32_t generalProfileCompatibilityFlags { 0 };
     52    uint8_t generalTierFlag { 0 };
     53    Vector<unsigned char, 6> generalConstraintIndicatorFlags { 0, 0, 0, 0, 0, 0 };
    3754    uint16_t generalLevelIDC { 0 };
    3855};
    3956
    4057WEBCORE_EXPORT std::optional<HEVCParameters> parseHEVCCodecParameters(StringView);
     58WEBCORE_EXPORT std::optional<HEVCParameters> parseHEVCDecoderConfigurationRecord(const FourCC&, const SharedBuffer&);
     59WEBCORE_EXPORT String createHEVCCodecParametersString(const HEVCParameters&);
    4160
    4261struct DoViParameters {
     
    4766
    4867WEBCORE_EXPORT std::optional<DoViParameters> parseDoViCodecParameters(StringView);
     68WEBCORE_EXPORT std::optional<DoViParameters> parseDoViDecoderConfigurationRecord(const SharedBuffer&);
     69WEBCORE_EXPORT String createDoViCodecParametersString(const DoViParameters&);
    4970
    5071}
  • trunk/Source/WebCore/platform/graphics/PlatformVideoColorPrimaries.h

    r286907 r286908  
    2626#pragma once
    2727
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
     28#include <wtf/Forward.h>
    3129
    3230namespace WebCore {
    3331
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     32enum class PlatformVideoColorPrimaries : uint8_t {
     33    Bt709,
     34    Bt470bg,
     35    Smpte170m,
     36};
     37
     38} // namespace WebCore
     39
     40namespace WTF {
     41
     42template<> struct EnumTraits<WebCore::PlatformVideoColorPrimaries> {
     43    using values = EnumValues<
     44        WebCore::PlatformVideoColorPrimaries,
     45        WebCore::PlatformVideoColorPrimaries::Bt709,
     46        WebCore::PlatformVideoColorPrimaries::Bt470bg,
     47        WebCore::PlatformVideoColorPrimaries::Smpte170m
     48    >;
    3749};
    3850
    3951}
    40 
    41 #endif
  • trunk/Source/WebCore/platform/graphics/PlatformVideoColorSpace.h

    r286907 r286908  
    2626#pragma once
    2727
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
     28#include "PlatformVideoColorPrimaries.h"
     29#include "PlatformVideoMatrixCoefficients.h"
     30#include "PlatformVideoTransferCharacteristics.h"
     31#include <wtf/FastMalloc.h>
    3132
    3233namespace WebCore {
    3334
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     35struct PlatformVideoColorSpace {
     36    WTF_MAKE_STRUCT_FAST_ALLOCATED;
     37    std::optional<PlatformVideoColorPrimaries> primaries;
     38    std::optional<PlatformVideoTransferCharacteristics> transfer;
     39    std::optional<PlatformVideoMatrixCoefficients> matrix;
     40    std::optional<bool> fullRange;
     41    template <class Encoder> void encode(Encoder&) const;
     42    template <class Decoder> static WARN_UNUSED_RETURN bool decode(Decoder&, PlatformVideoColorSpace&);
    3743};
    3844
     45template <class Encoder>
     46void PlatformVideoColorSpace::encode(Encoder& encoder) const
     47{
     48    encoder << primaries;
     49    encoder << transfer;
     50    encoder << matrix;
     51    encoder << fullRange;
    3952}
    4053
    41 #endif
     54template <class Decoder>
     55bool PlatformVideoColorSpace::decode(Decoder& decoder, PlatformVideoColorSpace& colorSpace)
     56{
     57    if (!decoder.decode(colorSpace.primaries))
     58        return false;
     59    if (!decoder.decode(colorSpace.transfer))
     60        return false;
     61    if (!decoder.decode(colorSpace.matrix))
     62        return false;
     63    if (!decoder.decode(colorSpace.fullRange))
     64        return false;
     65    return true;
     66}
     67
     68}
  • trunk/Source/WebCore/platform/graphics/PlatformVideoMatrixCoefficients.h

    r286907 r286908  
    2626#pragma once
    2727
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
     28#include <wtf/Forward.h>
    3129
    3230namespace WebCore {
    3331
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     32enum class PlatformVideoMatrixCoefficients : uint8_t {
     33    Rgb,
     34    Bt709,
     35    Bt470bg,
     36    Smpte170m,
     37};
     38
     39} // namespace WebCore
     40
     41namespace WTF {
     42
     43template<> struct EnumTraits<WebCore::PlatformVideoMatrixCoefficients> {
     44    using values = EnumValues<
     45        WebCore::PlatformVideoMatrixCoefficients,
     46        WebCore::PlatformVideoMatrixCoefficients::Rgb,
     47        WebCore::PlatformVideoMatrixCoefficients::Bt709,
     48        WebCore::PlatformVideoMatrixCoefficients::Bt470bg,
     49        WebCore::PlatformVideoMatrixCoefficients::Smpte170m
     50    >;
    3751};
    3852
    3953}
    40 
    41 #endif
  • trunk/Source/WebCore/platform/graphics/PlatformVideoTransferCharacteristics.h

    r286907 r286908  
    2626#pragma once
    2727
    28 #if ENABLE(VIDEO)
    29 
    30 #include "TrackPrivateBaseClient.h"
     28#include <wtf/Forward.h>
    3129
    3230namespace WebCore {
    3331
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
     32enum class PlatformVideoTransferCharacteristics : uint8_t {
     33    Bt709,
     34    Smpte170m,
     35    Iec6196621,
     36};
     37
     38} // namespace WebCore
     39
     40namespace WTF {
     41
     42template<> struct EnumTraits<WebCore::PlatformVideoTransferCharacteristics> {
     43    using values = EnumValues<
     44        WebCore::PlatformVideoTransferCharacteristics,
     45        WebCore::PlatformVideoTransferCharacteristics::Bt709,
     46        WebCore::PlatformVideoTransferCharacteristics::Smpte170m,
     47        WebCore::PlatformVideoTransferCharacteristics::Iec6196621
     48    >;
    3749};
    3850
    3951}
    40 
    41 #endif
  • trunk/Source/WebCore/platform/graphics/VideoTrackPrivate.h

    r286813 r286908  
    2828#if ENABLE(VIDEO)
    2929
     30#include "PlatformVideoColorSpace.h"
    3031#include "TrackPrivateBase.h"
    3132#include "VideoTrackPrivateClient.h"
     
    6263    void setSelectedChangedCallback(SelectedChangedCallback&& callback) { m_selectedChangedCallback = WTFMove(callback); }
    6364
     65    virtual String codec() const { return m_codec; }
     66    virtual void setCodec(String&& codec) { m_codec = WTFMove(codec); }
     67   
     68    virtual uint32_t width() const { return m_width; }
     69    virtual void setWidth(uint32_t width) { m_width = width; }
     70   
     71    virtual uint32_t height() const { return m_height; }
     72    virtual void setHeight(uint32_t height) { m_height = height; }
     73   
     74    virtual PlatformVideoColorSpace colorSpace() const { return m_colorSpace; }
     75    virtual void setColorSpace(PlatformVideoColorSpace&& colorSpace) { m_colorSpace = WTFMove(colorSpace); }
     76   
     77    virtual double framerate() const { return m_framerate; }
     78    virtual void setFramerate(double framerate) { m_framerate = framerate; }
     79   
     80    virtual uint64_t bitrate() const { return m_bitrate; }
     81    virtual void setBitrate(uint64_t bitrate) { m_bitrate = bitrate; }
     82   
    6483protected:
    6584    VideoTrackPrivate() = default;
     
    6887    WeakPtr<VideoTrackPrivateClient> m_client { nullptr };
    6988    bool m_selected { false };
     89    String m_codec;
     90    uint32_t m_width { 0 };
     91    uint32_t m_height { 0 };
     92    PlatformVideoColorSpace m_colorSpace;
     93    double m_framerate { 0 };
     94    uint64_t m_bitrate { 0 };
     95
    7096    SelectedChangedCallback m_selectedChangedCallback;
    7197};
  • trunk/Source/WebCore/platform/graphics/VideoTrackPrivateClient.h

    r286813 r286908  
    3535public:
    3636    virtual void selectedChanged(bool) = 0;
     37    virtual void configurationChanged() = 0;
    3738};
    3839
  • trunk/Source/WebCore/platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.h

    r286813 r286908  
    3030
    3131#include "AudioTrackPrivate.h"
     32#include "PlatformVideoColorSpace.h"
    3233#include "VideoTrackPrivate.h"
    3334#include <wtf/Ref.h>
     
    3940OBJC_CLASS AVMediaSelectionGroup;
    4041OBJC_CLASS AVMediaSelectionOption;
     42
     43typedef const struct opaqueCMFormatDescription* CMFormatDescriptionRef;
    4144
    4245namespace WebCore {
     
    6972    int trackID() const;
    7073
     74    String codec() const;
     75    uint32_t width() const;
     76    uint32_t height() const;
     77    PlatformVideoColorSpace colorSpace() const;
     78    double framerate() const;
     79    uint64_t bitrate() const;
     80    uint32_t sampleRate() const;
     81    uint32_t numberOfChannels() const;
    7182    static String languageForAVAssetTrack(AVAssetTrack*);
    7283    static String languageForAVMediaSelectionOption(AVMediaSelectionOption *);
  • trunk/Source/WebCore/platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.mm

    r286813 r286908  
    2929#if ENABLE(VIDEO)
    3030
     31#import "FormatDescriptionUtilities.h"
    3132#import "MediaSelectionGroupAVFObjC.h"
     33#import "SharedBuffer.h"
    3234#import <AVFoundation/AVAssetTrack.h>
    3335#import <AVFoundation/AVMediaSelectionGroup.h>
     
    3739#import <objc/runtime.h>
    3840
     41#import <pal/cf/CoreMediaSoftLink.h>
    3942#import <pal/cocoa/AVFoundationSoftLink.h>
    4043
     
    240243}
    241244
     245static AVAssetTrack* assetTrackFor(const AVTrackPrivateAVFObjCImpl& impl)
     246{
     247    if (impl.playerItemTrack() && impl.playerItemTrack().assetTrack)
     248        return impl.playerItemTrack().assetTrack;
     249    if (impl.assetTrack())
     250        return impl.assetTrack();
     251    if (impl.mediaSelectionOption() && impl.mediaSelectionOption()->assetTrack())
     252        return impl.mediaSelectionOption()->assetTrack();
     253    return nil;
     254}
     255
     256static CMFormatDescriptionRef formatDescriptionFor(const AVTrackPrivateAVFObjCImpl& impl)
     257{
     258    auto assetTrack = assetTrackFor(impl);
     259    if (!assetTrack || !assetTrack.formatDescriptions.count)
     260        return nullptr;
     261    return static_cast<CMFormatDescriptionRef>(assetTrack.formatDescriptions[0]);
     262}
     263
     264String AVTrackPrivateAVFObjCImpl::codec() const
     265{
     266    return codecFromFormatDescription(formatDescriptionFor(*this));
     267}
     268
     269uint32_t AVTrackPrivateAVFObjCImpl::width() const
     270{
     271    if (auto assetTrack = assetTrackFor(*this))
     272        return assetTrack.naturalSize.width;
     273    ASSERT_NOT_REACHED();
     274    return 0;
     275}
     276
     277uint32_t AVTrackPrivateAVFObjCImpl::height() const
     278{
     279    if (auto assetTrack = assetTrackFor(*this))
     280        return assetTrack.naturalSize.height;
     281    ASSERT_NOT_REACHED();
     282    return 0;
     283}
     284
     285PlatformVideoColorSpace AVTrackPrivateAVFObjCImpl::colorSpace() const
     286{
     287    if (auto colorSpace = colorSpaceFromFormatDescription(formatDescriptionFor(*this)))
     288        return *colorSpace;
     289    return { };
     290}
     291
     292double AVTrackPrivateAVFObjCImpl::framerate() const
     293{
     294    if (auto assetTrack = assetTrackFor(*this))
     295        return assetTrack.nominalFrameRate;
     296    ASSERT_NOT_REACHED();
     297    return 0;
     298}
     299
     300uint32_t AVTrackPrivateAVFObjCImpl::sampleRate() const
     301{
     302    auto formatDescription = formatDescriptionFor(*this);
     303    if (!formatDescription)
     304        return 0;
     305
     306    const AudioStreamBasicDescription* const asbd = PAL::CMAudioFormatDescriptionGetStreamBasicDescription(formatDescription);
     307    if (!asbd)
     308        return 0;
     309
     310    return asbd->mSampleRate;
     311}
     312
     313uint32_t AVTrackPrivateAVFObjCImpl::numberOfChannels() const
     314{
     315    auto formatDescription = formatDescriptionFor(*this);
     316    if (!formatDescription)
     317        return 0;
     318
     319    const AudioStreamBasicDescription* const asbd = PAL::CMAudioFormatDescriptionGetStreamBasicDescription(formatDescription);
     320    if (!asbd)
     321        return 0;
     322
     323    return asbd->mChannelsPerFrame;
     324}
     325
     326uint64_t AVTrackPrivateAVFObjCImpl::bitrate() const
     327{
     328    auto assetTrack = assetTrackFor(*this);
     329    if (!assetTrack)
     330        return 0;
     331    if (!std::isfinite(assetTrack.estimatedDataRate))
     332        return 0;
     333    return assetTrack.estimatedDataRate;
     334}
     335
    242336}
    243337
  • trunk/Source/WebCore/platform/graphics/avfoundation/AudioTrackPrivateAVF.h

    r286813 r286908  
    3535    WTF_MAKE_NONCOPYABLE(AudioTrackPrivateAVF)
    3636public:
    37     virtual Kind kind() const { return m_kind; }
    38     virtual AtomString id() const { return m_id; }
    39     virtual AtomString label() const { return m_label; }
    40     virtual AtomString language() const { return m_language; }
    41     virtual int trackIndex() const { return m_index; }
     37    Kind kind() const override { return m_kind; }
     38    AtomString id() const override { return m_id; }
     39    AtomString label() const override { return m_label; }
     40    AtomString language() const override { return m_language; }
     41    int trackIndex() const override { return m_index; }
    4242
    4343protected:
     
    4747    void setLanguage(const AtomString& language) { m_language = language; }
    4848    void setTrackIndex(int index) { m_index = index; }
    49 
     49   
    5050    Kind m_kind { None };
    5151    AtomString m_id;
  • trunk/Source/WebCore/platform/graphics/avfoundation/FormatDescriptionUtilities.h

    r286907 r286908  
    2626#pragma once
    2727
    28 #if ENABLE(VIDEO)
     28#include <wtf/Forward.h>
    2929
    30 #include "TrackPrivateBaseClient.h"
     30typedef const struct opaqueCMFormatDescription *CMFormatDescriptionRef;
    3131
    3232namespace WebCore {
    3333
    34 class VideoTrackPrivateClient : public TrackPrivateBaseClient {
    35 public:
    36     virtual void selectedChanged(bool) = 0;
    37 };
     34class FloatSize;
     35struct PlatformVideoColorSpace;
     36
     37FloatSize presentationSizeFromFormatDescription(CMFormatDescriptionRef);
     38std::optional<PlatformVideoColorSpace> colorSpaceFromFormatDescription(CMFormatDescriptionRef);
     39String codecFromFormatDescription(CMFormatDescriptionRef);
    3840
    3941}
    40 
    41 #endif
  • trunk/Source/WebCore/platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.h

    r286813 r286908  
    5555
    5656    AVMediaSelectionOption *avMediaSelectionOption() const { return m_mediaSelectionOption.get(); }
     57    AVAssetTrack *assetTrack() const;
    5758
    5859private:
  • trunk/Source/WebCore/platform/graphics/avfoundation/MediaSelectionGroupAVFObjC.mm

    r286813 r286908  
    3030
    3131#import <AVFoundation/AVAsset.h>
    32 #import <AVFoundation/AVMediaSelectionGroup.h>
    3332#import <AVFoundation/AVPlayerItem.h>
    3433#import <objc/runtime.h>
     34#import <pal/spi/cocoa/AVFoundationSPI.h>
    3535#import <wtf/Language.h>
    3636#import <wtf/cocoa/VectorCocoa.h>
     
    8181
    8282    return [[m_group->avMediaSelectionGroup() options] indexOfObject:m_mediaSelectionOption.get()];
     83}
     84
     85AVAssetTrack* MediaSelectionOptionAVFObjC::assetTrack() const
     86{
     87    if ([m_mediaSelectionOption respondsToSelector:@selector(track)])
     88        return [m_mediaSelectionOption track];
     89    return nil;
    8390}
    8491
  • trunk/Source/WebCore/platform/graphics/avfoundation/VideoTrackPrivateAVF.h

    r286813 r286908  
    4848    void setTrackIndex(int index) { m_index = index; }
    4949
     50
    5051    Kind m_kind { None };
    5152    AtomString m_id;
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm

    r286813 r286908  
    5656    setLabel(m_impl->label());
    5757    setLanguage(m_impl->language());
     58    setCodec(m_impl->codec());
     59    setSampleRate(m_impl->sampleRate());
     60    setNumberOfChannels(m_impl->numberOfChannels());
     61    setBitrate(m_impl->bitrate());
     62
    5863}
    5964
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/SourceBufferParserAVFObjC.mm

    r286813 r286908  
    172172            m_originalCodec = PAL::softLink_CoreMedia_CMFormatDescriptionGetMediaSubType(description);
    173173            CFStringRef originalFormatKey = PAL::canLoad_CoreMedia_kCMFormatDescriptionExtension_ProtectedContentOriginalFormat() ? PAL::get_CoreMedia_kCMFormatDescriptionExtension_ProtectedContentOriginalFormat() : CFSTR("CommonEncryptionOriginalFormat");
    174             if (auto originalFormat = dynamic_cf_cast<CFNumberRef>(CMFormatDescriptionGetExtension(description, originalFormatKey)))
     174            if (auto originalFormat = dynamic_cf_cast<CFNumberRef>(PAL::CMFormatDescriptionGetExtension(description, originalFormatKey)))
    175175                CFNumberGetValue(originalFormat, kCFNumberSInt32Type, &m_originalCodec);
    176176        }
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp

    r286813 r286908  
    6363    setLabel(m_impl->label());
    6464    setLanguage(m_impl->language());
     65    setCodec(m_impl->codec());
     66    setWidth(m_impl->width());
     67    setHeight(m_impl->height());
     68    setColorSpace(m_impl->colorSpace());
     69    setFramerate(m_impl->framerate());
     70    setBitrate(m_impl->bitrate());
     71
     72    if (auto* client = this->client())
     73        client->configurationChanged();
    6574}
    6675
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/VideoTrackPrivateMediaSourceAVFObjC.mm

    r286813 r286908  
    5151    setLabel(m_impl->label());
    5252    setLanguage(m_impl->language());
     53    setCodec(m_impl->codec());
     54    setWidth(m_impl->width());
     55    setHeight(m_impl->height());
     56    setColorSpace(m_impl->colorSpace());
     57    setFramerate(m_impl->framerate());
     58    setBitrate(m_impl->bitrate());
    5359}
    5460
  • trunk/Source/WebCore/platform/graphics/cocoa/VideoTrackPrivateWebM.cpp

    r286813 r286908  
    8787}
    8888
     89String VideoTrackPrivateWebM::codec() const
     90{
     91    if (!m_track.codec_id.is_present())
     92        return emptyString();
     93
     94    StringView codecID { m_track.codec_id.value().data(), (unsigned)m_track.codec_id.value().length() };
     95
     96    // TODO: Specific codec parameters are parsed out of the sample header; they aren't typically contained in the WebM Track element.
     97    if (codecID == "V_VP9")
     98        return "vp09";
     99
     100    if (codecID == "V_VP8")
     101        return "vp08";
     102
     103    return emptyString();
     104}
     105
     106uint32_t VideoTrackPrivateWebM::width() const
     107{
     108    if (!m_track.video.is_present())
     109        return 0;
     110
     111    auto& video = m_track.video.value();
     112    if (video.display_width.is_present())
     113        return video.display_width.value();
     114
     115    if (video.pixel_width.is_present())
     116        return video.pixel_width.value();
     117
     118    return 0;
     119}
     120
     121uint32_t VideoTrackPrivateWebM::height() const
     122{
     123    if (!m_track.video.is_present())
     124        return 0;
     125
     126    auto& video = m_track.video.value();
     127    if (video.display_height.is_present())
     128        return video.display_height.value();
     129
     130    if (video.pixel_height.is_present())
     131        return video.pixel_height.value();
     132
     133    return 0;
     134}
     135
     136double VideoTrackPrivateWebM::framerate() const
     137{
     138    if (!m_track.video.is_present())
     139        return 0;
     140
     141    auto& video = m_track.video.value();
     142    if (video.frame_rate.is_present())
     143        return video.frame_rate.value();
     144
     145    return 0;
     146}
     147
    89148}
    90149
  • trunk/Source/WebCore/platform/graphics/cocoa/VideoTrackPrivateWebM.h

    r286813 r286908  
    4444    std::optional<uint64_t> trackUID() const final;
    4545    std::optional<bool> defaultEnabled() const final;
     46    String codec() const final;
     47    uint32_t width() const final;
     48    uint32_t height() const final;
     49    double framerate() const final;
    4650
    4751private:
  • trunk/Source/WebCore/testing/Internals.cpp

    r286813 r286908  
    59385938}
    59395939
     5940String Internals::createHEVCCodecParametersString(const HEVCParameterSet& parameters)
     5941{
     5942    return WebCore::createHEVCCodecParametersString(parameters);
     5943}
     5944
    59405945auto Internals::parseDoViCodecParameters(StringView string) -> std::optional<DoViParameterSet>
    59415946{
     
    59635968}
    59645969
     5970String Internals::createDoViCodecParametersString(const DoViParameterSet& parameterSet)
     5971{
     5972    DoViParameters::Codec codec;
     5973    if (parameterSet.codecName == "avc1"_s)
     5974        codec = DoViParameters::Codec::AVC1;
     5975    else if (parameterSet.codecName == "avc3"_s)
     5976        codec = DoViParameters::Codec::AVC3;
     5977    else if (parameterSet.codecName == "hev1"_s)
     5978        codec = DoViParameters::Codec::HEV1;
     5979    else if (parameterSet.codecName == "hvc1"_s)
     5980        codec = DoViParameters::Codec::HVC1;
     5981    else
     5982        return emptyString();
     5983
     5984    return WebCore::createDoViCodecParametersString({ codec, parameterSet.bitstreamProfileID, parameterSet.bitstreamLevelID });
     5985}
     5986
    59655987std::optional<VPCodecConfigurationRecord> Internals::parseVPCodecParameters(StringView string)
    59665988{
  • trunk/Source/WebCore/testing/Internals.h

    r286813 r286908  
    10271027       
    10281028    using HEVCParameterSet = WebCore::HEVCParameters;
     1029    using HEVCParameterCodec = WebCore::HEVCParameters::Codec;
    10291030    std::optional<HEVCParameterSet> parseHEVCCodecParameters(StringView);
     1031    String createHEVCCodecParametersString(const HEVCParameterSet& parameters);
    10301032
    10311033    struct DoViParameterSet {
     
    10351037    };
    10361038    std::optional<DoViParameterSet> parseDoViCodecParameters(StringView);
     1039    String createDoViCodecParametersString(const DoViParameterSet& parameters);
    10371040
    10381041    using VPCodecConfigurationRecord = WebCore::VPCodecConfigurationRecord;
  • trunk/Source/WebCore/testing/Internals.idl

    r286813 r286908  
    181181};
    182182
     183enum HEVCParameterCodec {
     184    "hev1",
     185    "hvc1"
     186};
     187
    183188[
    184189    ExportMacro=WEBCORE_TESTSUPPORT_EXPORT,
    185190    JSGenerateToJSObject,
    186191] dictionary HEVCParameterSet {
     192    HEVCParameterCodec codec;
    187193    unsigned short generalProfileSpace;
    188194    unsigned short generalProfileIDC;
    189195    unsigned long generalProfileCompatibilityFlags;
     196    octet generalTierFlag;
     197    required FrozenArray<octet> generalConstraintIndicatorFlags;
    190198    unsigned short generalLevelIDC;
    191199};
     
    9961004
    9971005    HEVCParameterSet? parseHEVCCodecParameters(DOMString codecParameters);
     1006    DOMString createHEVCCodecParametersString(HEVCParameterSet parameters);
    9981007    DoViParameterSet? parseDoViCodecParameters(DOMString codecParameters);
     1008    DOMString createDoViCodecParametersString(DoViParameterSet parameters);
    9991009    VPCodecConfigurationRecord? parseVPCodecParameters(DOMString codecParameters);
    10001010
  • trunk/Source/WebKit/ChangeLog

    r286905 r286908  
     12021-12-11  Jer Noble  <jer.noble@apple.com>
     2
     3        Add an experimental trackConfiguration accessor on AudioTrack & VideoTrack.
     4        https://bugs.webkit.org/show_bug.cgi?id=230841
     5
     6        Reviewed by Eric Carlson.
     7
     8        * GPUProcess/media/RemoteAudioTrackProxy.cpp:
     9        (WebKit::RemoteAudioTrackProxy::configuration):
     10        * GPUProcess/media/RemoteAudioTrackProxy.h:
     11        * GPUProcess/media/RemoteVideoTrackProxy.cpp:
     12        (WebKit::RemoteVideoTrackProxy::configuration):
     13        (WebKit::RemoteVideoTrackProxy::updateConfiguration):
     14        (WebKit::RemoteVideoTrackProxy::selectedChanged):
     15        (WebKit::RemoteVideoTrackProxy::idChanged):
     16        (WebKit::RemoteVideoTrackProxy::labelChanged):
     17        (WebKit::RemoteVideoTrackProxy::languageChanged):
     18        (WebKit::RemoteVideoTrackProxy::configurationChanged): Deleted.
     19        * GPUProcess/media/RemoteVideoTrackProxy.h:
     20        * GPUProcess/media/TrackPrivateRemoteConfiguration.h:
     21        (WebKit::TrackPrivateRemoteConfiguration::encode const):
     22        (WebKit::TrackPrivateRemoteConfiguration::decode):
     23        * WebProcess/GPU/media/AudioTrackPrivateRemote.cpp:
     24        (WebKit::AudioTrackPrivateRemote::updateConfiguration):
     25        * WebProcess/GPU/media/AudioTrackPrivateRemote.h:
     26        * WebProcess/GPU/media/VideoTrackPrivateRemote.cpp:
     27        (WebKit::VideoTrackPrivateRemote::updateConfiguration):
     28        * WebProcess/GPU/media/VideoTrackPrivateRemote.h:
     29
    1302021-12-10  Simon Fraser  <simon.fraser@apple.com>
    231
  • trunk/Source/WebKit/GPUProcess/media/RemoteAudioTrackProxy.cpp

    r286813 r286908  
    5555}
    5656
    57 TrackPrivateRemoteConfiguration& RemoteAudioTrackProxy::configuration()
     57TrackPrivateRemoteConfiguration RemoteAudioTrackProxy::configuration()
    5858{
    59     static NeverDestroyed<TrackPrivateRemoteConfiguration> configuration;
    60 
    61     configuration->trackId = m_trackPrivate->id();
    62     configuration->label = m_trackPrivate->label();
    63     configuration->language = m_trackPrivate->language();
    64     configuration->trackIndex = m_trackPrivate->trackIndex();
    65     configuration->startTimeVariance = m_trackPrivate->startTimeVariance();
    66     configuration->enabled = m_trackPrivate->enabled();
    67     configuration->audioKind = m_trackPrivate->kind();
    68 
    69     return configuration.get();
     59    return {
     60        m_trackPrivate->id(),
     61        m_trackPrivate->label(),
     62        m_trackPrivate->language(),
     63        m_trackPrivate->startTimeVariance(),
     64        m_trackPrivate->trackIndex(),
     65        m_trackPrivate->enabled(),
     66        m_trackPrivate->kind(),
     67        false,
     68        WebCore::VideoTrackPrivate::Kind::None,
     69        m_trackPrivate->codec(),
     70        0,
     71        0,
     72        { },
     73        0,
     74        m_trackPrivate->bitrate(),
     75        m_trackPrivate->sampleRate(),
     76        m_trackPrivate->numberOfChannels(),
     77    };
    7078}
    7179
  • trunk/Source/WebKit/GPUProcess/media/RemoteAudioTrackProxy.h

    r286813 r286908  
    7777    void willRemove() final;
    7878
    79     TrackPrivateRemoteConfiguration& configuration();
     79    TrackPrivateRemoteConfiguration configuration();
    8080    void configurationChanged();
    8181
  • trunk/Source/WebKit/GPUProcess/media/RemoteVideoTrackProxy.cpp

    r286813 r286908  
    5555}
    5656
    57 TrackPrivateRemoteConfiguration& RemoteVideoTrackProxy::configuration()
     57TrackPrivateRemoteConfiguration RemoteVideoTrackProxy::configuration()
    5858{
    59     static NeverDestroyed<TrackPrivateRemoteConfiguration> configuration;
    60 
    61     configuration->trackId = m_trackPrivate->id();
    62     configuration->label = m_trackPrivate->label();
    63     configuration->language = m_trackPrivate->language();
    64     configuration->trackIndex = m_trackPrivate->trackIndex();
    65     configuration->startTimeVariance = m_trackPrivate->startTimeVariance();
    66     configuration->selected = m_trackPrivate->selected();
    67     configuration->videoKind = m_trackPrivate->kind();
    68 
    69     return configuration.get();
     59    TrackPrivateRemoteConfiguration configuration { };
     60    configuration.trackId = m_trackPrivate->id();
     61    configuration.label = m_trackPrivate->label();
     62    configuration.language = m_trackPrivate->language();
     63    configuration.trackIndex = m_trackPrivate->trackIndex();
     64    configuration.startTimeVariance = m_trackPrivate->startTimeVariance();
     65    configuration.selected = m_trackPrivate->selected();
     66    configuration.videoKind = m_trackPrivate->kind();
     67    configuration.codec = m_trackPrivate->codec();
     68    configuration.width = m_trackPrivate->width();
     69    configuration.height = m_trackPrivate->height();
     70    configuration.colorSpace = m_trackPrivate->colorSpace();
     71    configuration.framerate = m_trackPrivate->framerate();
     72    configuration.bitrate = m_trackPrivate->bitrate();
     73    return configuration;
    7074}
    7175
    72 void RemoteVideoTrackProxy::configurationChanged()
     76void RemoteVideoTrackProxy::updateConfiguration()
    7377{
    7478    if (!m_connectionToWebProcess)
     
    8892        return;
    8993    m_selected = selected;
    90     configurationChanged();
     94    updateConfiguration();
    9195}
    9296
    9397void RemoteVideoTrackProxy::idChanged(const AtomString&)
    9498{
    95     configurationChanged();
     99    updateConfiguration();
    96100}
    97101
    98102void RemoteVideoTrackProxy::labelChanged(const AtomString&)
    99103{
    100     configurationChanged();
     104    updateConfiguration();
    101105}
    102106
    103107void RemoteVideoTrackProxy::languageChanged(const AtomString&)
    104108{
    105     configurationChanged();
     109    updateConfiguration();
    106110}
    107111
  • trunk/Source/WebKit/GPUProcess/media/RemoteVideoTrackProxy.h

    r286813 r286908  
    7070    // VideoTrackPrivateClient
    7171    void selectedChanged(bool) final;
     72    void configurationChanged() final { updateConfiguration(); }
    7273
    7374    // TrackPrivateBaseClient
     
    7778    void willRemove() final;
    7879
    79     TrackPrivateRemoteConfiguration& configuration();
    80     void configurationChanged();
     80    TrackPrivateRemoteConfiguration configuration();
     81    void updateConfiguration();
    8182
    8283    WeakPtr<GPUConnectionToWebProcess> m_connectionToWebProcess;
  • trunk/Source/WebKit/GPUProcess/media/TrackPrivateRemoteConfiguration.h

    r286813 r286908  
    4747    WebCore::VideoTrackPrivate::Kind videoKind { WebCore::VideoTrackPrivate::Kind::None };
    4848
     49    String codec;
     50    uint32_t width;
     51    uint32_t height;
     52    WebCore::PlatformVideoColorSpace colorSpace;
     53    double framerate;
     54    uint64_t bitrate;
     55    uint32_t sampleRate;
     56    uint32_t numberOfChannels;
     57
    4958    template<class Encoder>
    5059    void encode(Encoder& encoder) const
     
    5968        encoder << selected;
    6069        encoder << videoKind;
     70        encoder << codec;
     71        encoder << width;
     72        encoder << height;
     73        encoder << colorSpace;
     74        encoder << framerate;
     75        encoder << bitrate;
     76        encoder << sampleRate;
     77        encoder << numberOfChannels;
    6178    }
    6279
     
    109126            return std::nullopt;
    110127
     128        std::optional<String> codec;
     129        decoder >> codec;
     130        if (!codec)
     131            return std::nullopt;
     132
     133        std::optional<uint32_t> width;
     134        decoder >> width;
     135        if (!width)
     136            return std::nullopt;
     137
     138        std::optional<uint32_t> height;
     139        decoder >> height;
     140        if (!height)
     141            return std::nullopt;
     142
     143        std::optional<WebCore::PlatformVideoColorSpace> colorSpace;
     144        decoder >> colorSpace;
     145        if (!colorSpace)
     146            return std::nullopt;
     147
     148        std::optional<double> framerate;
     149        decoder >> framerate;
     150        if (!framerate)
     151            return std::nullopt;
     152
     153        std::optional<uint64_t> bitrate;
     154        decoder >> bitrate;
     155        if (!bitrate)
     156            return std::nullopt;
     157       
     158        std::optional<uint32_t> sampleRate;
     159        decoder >> sampleRate;
     160        if (!sampleRate)
     161            return std::nullopt;
     162
     163        std::optional<uint32_t> numberOfChannels;
     164        decoder >> numberOfChannels;
     165        if (!numberOfChannels)
     166            return std::nullopt;
     167
    111168        return {{
    112169            WTFMove(*trackId),
     
    119176            *selected,
    120177            *videoKind,
     178            WTFMove(*codec),
     179            *width,
     180            *height,
     181            WTFMove(*colorSpace),
     182            *framerate,
     183            *bitrate,
     184            *sampleRate,
     185            *numberOfChannels,
    121186        }};
    122187    }
  • trunk/Source/WebKit/WebProcess/GPU/media/AudioTrackPrivateRemote.cpp

    r286813 r286908  
    8282    m_startTimeVariance = configuration.startTimeVariance;
    8383    m_kind = configuration.audioKind;
     84    setCodec(WTFMove(configuration.codec));
     85    setSampleRate(configuration.sampleRate);
     86    setNumberOfChannels(configuration.numberOfChannels);
     87    setBitrate(configuration.bitrate);
     88   
    8489    AudioTrackPrivate::setEnabled(configuration.enabled);
    8590}
  • trunk/Source/WebKit/WebProcess/GPU/media/AudioTrackPrivateRemote.h

    r286813 r286908  
    6767    AtomString m_language;
    6868    int m_trackIndex { -1 };
     69
    6970    MediaTime m_startTimeVariance { MediaTime::zeroTime() };
    7071    WebCore::MediaPlayerIdentifier m_playerIdentifier;
  • trunk/Source/WebKit/WebProcess/GPU/media/VideoTrackPrivateRemote.cpp

    r286813 r286908  
    8181    m_startTimeVariance = configuration.startTimeVariance;
    8282    m_kind = configuration.videoKind;
     83    m_codec = configuration.codec;
     84    m_width = configuration.width;
     85    m_height = configuration.height;
     86    m_colorSpace = configuration.colorSpace;
     87    m_framerate = configuration.framerate;
     88    m_bitrate = configuration.bitrate;
     89
    8390    VideoTrackPrivate::setSelected(configuration.selected);
    8491}
  • trunk/Source/WebKit/WebProcess/GPU/media/VideoTrackPrivateRemote.h

    r286813 r286908  
    5858    int trackIndex() const final { return m_trackIndex; }
    5959    MediaTime startTimeVariance() const final { return m_startTimeVariance; }
     60    String codec() const final { return m_codec; }
     61    uint32_t width() const final { return m_width; }
     62    uint32_t height() const final { return m_height; }
     63    WebCore::PlatformVideoColorSpace colorSpace() const final { return m_colorSpace; }
     64    double framerate() const final { return m_framerate; }
     65    uint64_t bitrate() const final { return m_bitrate; }
    6066
    6167private:
     
    7177    AtomString m_language;
    7278    int m_trackIndex { -1 };
     79    String m_codec;
     80    uint32_t m_width { 0 };
     81    uint32_t m_height { 0 };
     82    WebCore::PlatformVideoColorSpace m_colorSpace;
     83    double m_framerate { 0 };
     84    uint64_t m_bitrate { 0 };
    7385    MediaTime m_startTimeVariance { MediaTime::zeroTime() };
    7486    TrackPrivateRemoteIdentifier m_idendifier;
Note: See TracChangeset for help on using the changeset viewer.