Changeset 287576 in webkit
- Timestamp:
- Jan 4, 2022, 10:21:44 AM (4 years ago)
- Location:
- branches/safari-613.1.12.1-branch
- Files:
-
- 42 edited
- 5 copied
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-613.1.12.1-branch/LayoutTests/ChangeLog
r286944 r287576 1 2022-01-04 Alan Coon <alancoon@apple.com> 2 3 Cherry-pick r287574. rdar://problem/86855896 4 5 [Cocoa] Hang in AVTrackPrivateAVFObjCImpl::bitrate() 6 https://bugs.webkit.org/show_bug.cgi?id=234753 7 8 Reviewed by Eric Carlson. 9 10 Source/WebCore: 11 12 In r286908, WebCore added new queries onto existing AVAssetTrack objects; however, querying 13 those properties will block if data for those properties is not yet available. The media element 14 could block moving to the HAVE_METADATA state until those properties are fully loaded, however 15 this might regress PLT, so instead, we will check the load state of those properties before returning 16 values. 17 18 However, to make the properties exposed through VideoTrackConfiguration.idl/AudioTrackConfiguration.idl 19 dynamic, changes need to be signaled and propagated upward through the layers between AVAssetTrack and 20 the DOM. Rather than make individual notifications for each property in a Configuration struct, make one 21 notification that handles any change to the Configuration struct at all and push that upward to clients. 22 23 Since these properties are being grouped together at a lower-level, they do not need to be tracked 24 individually, and Video/AudioTrackConfigurationInit can just be aliased to a platform-defined struct. 25 26 * html/track/AudioTrack.cpp: 27 (WebCore::AudioTrack::configurationChanged): 28 (WebCore::AudioTrack::updateConfigurationFromPrivate): 29 * html/track/AudioTrack.h: 30 * html/track/AudioTrackConfiguration.h: 31 (WebCore::AudioTrackConfiguration::setState): 32 (): Deleted. 33 * html/track/VideoTrack.cpp: 34 (WebCore::VideoTrack::configurationChanged): 35 (WebCore::VideoTrack::updateConfigurationFromPrivate): 36 * html/track/VideoTrack.h: 37 * html/track/VideoTrackConfiguration.h: 38 (WebCore::VideoTrackConfiguration::setState): 39 (WebCore::VideoTrackConfiguration::colorSpace const): 40 (WebCore::VideoTrackConfiguration::setColorSpace): 41 (WebCore::VideoTrackConfiguration::VideoTrackConfiguration): 42 (): Deleted. 43 * platform/graphics/AudioTrackPrivate.h: 44 (WebCore::AudioTrackPrivate::configuration const): 45 (WebCore::AudioTrackPrivate::setConfiguration): 46 (WebCore::AudioTrackPrivate::codec const): Deleted. 47 (WebCore::AudioTrackPrivate::setCodec): Deleted. 48 (WebCore::AudioTrackPrivate::sampleRate const): Deleted. 49 (WebCore::AudioTrackPrivate::setSampleRate): Deleted. 50 (WebCore::AudioTrackPrivate::numberOfChannels const): Deleted. 51 (WebCore::AudioTrackPrivate::setNumberOfChannels): Deleted. 52 (WebCore::AudioTrackPrivate::bitrate const): Deleted. 53 (WebCore::AudioTrackPrivate::setBitrate): Deleted. 54 * platform/graphics/AudioTrackPrivateClient.h: 55 * platform/graphics/PlatformVideoColorSpace.h: 56 (WebCore::operator==): 57 (WebCore::operator!=): 58 * platform/graphics/VideoTrackPrivate.h: 59 (WebCore::VideoTrackPrivate::configuration const): 60 (WebCore::VideoTrackPrivate::setConfiguration): 61 (WebCore::VideoTrackPrivate::codec const): Deleted. 62 (WebCore::VideoTrackPrivate::setCodec): Deleted. 63 (WebCore::VideoTrackPrivate::width const): Deleted. 64 (WebCore::VideoTrackPrivate::setWidth): Deleted. 65 (WebCore::VideoTrackPrivate::height const): Deleted. 66 (WebCore::VideoTrackPrivate::setHeight): Deleted. 67 (WebCore::VideoTrackPrivate::colorSpace const): Deleted. 68 (WebCore::VideoTrackPrivate::setColorSpace): Deleted. 69 (WebCore::VideoTrackPrivate::framerate const): Deleted. 70 (WebCore::VideoTrackPrivate::setFramerate): Deleted. 71 (WebCore::VideoTrackPrivate::bitrate const): Deleted. 72 (WebCore::VideoTrackPrivate::setBitrate): Deleted. 73 * platform/graphics/VideoTrackPrivateClient.h: 74 * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.h: 75 (WebCore::AVTrackPrivateAVFObjCImpl::setVideoTrackConfigurationObserver): 76 (WebCore::AVTrackPrivateAVFObjCImpl::setAudioTrackConfigurationObserver): 77 * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.mm: 78 (WebCore::assetTrackConfigurationKeyNames): 79 (WebCore::AVTrackPrivateAVFObjCImpl::AVTrackPrivateAVFObjCImpl): 80 (WebCore::AVTrackPrivateAVFObjCImpl::initializeAssetTrack): 81 (WebCore::AVTrackPrivateAVFObjCImpl::videoTrackConfiguration const): 82 (WebCore::AVTrackPrivateAVFObjCImpl::audioTrackConfiguration const): 83 * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.h: 84 * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm: 85 (WebCore::AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC): 86 (WebCore::AudioTrackPrivateAVFObjC::resetPropertiesFromTrack): 87 (WebCore::AudioTrackPrivateAVFObjC::audioTrackConfigurationChanged): 88 * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp: 89 (WebCore::VideoTrackPrivateAVFObjC::VideoTrackPrivateAVFObjC): 90 (WebCore::VideoTrackPrivateAVFObjC::resetPropertiesFromTrack): 91 (WebCore::VideoTrackPrivateAVFObjC::videoTrackConfigurationChanged): 92 * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.h: 93 * platform/graphics/avfoundation/objc/VideoTrackPrivateMediaSourceAVFObjC.mm: 94 (WebCore::VideoTrackPrivateMediaSourceAVFObjC::resetPropertiesFromTrack): 95 * platform/graphics/cocoa/VideoTrackPrivateWebM.cpp: 96 (WebCore::VideoTrackPrivateWebM::VideoTrackPrivateWebM): 97 (WebCore::VideoTrackPrivateWebM::updateConfiguration): 98 * platform/graphics/cocoa/VideoTrackPrivateWebM.h: 99 100 Source/WebKit: 101 102 Propagate changes to TrackConfigurations upwards from the GPU process -> WebContent process. 103 104 * GPUProcess/media/AudioTrackPrivateRemoteConfiguration.h: 105 (WebKit::AudioTrackPrivateRemoteConfiguration::encode const): 106 (WebKit::AudioTrackPrivateRemoteConfiguration::decode): 107 * GPUProcess/media/RemoteAudioTrackProxy.cpp: 108 (WebKit::RemoteAudioTrackProxy::configuration): 109 (WebKit::RemoteAudioTrackProxy::configurationChanged): 110 * GPUProcess/media/RemoteAudioTrackProxy.h: 111 * GPUProcess/media/RemoteVideoTrackProxy.cpp: 112 (WebKit::RemoteVideoTrackProxy::configuration): 113 * GPUProcess/media/RemoteVideoTrackProxy.h: 114 * GPUProcess/media/TrackPrivateRemoteConfiguration.h: 115 (WebKit::TrackPrivateRemoteConfiguration::encode const): 116 (WebKit::TrackPrivateRemoteConfiguration::decode): 117 * GPUProcess/media/VideoTrackPrivateRemoteConfiguration.h: 118 (WebKit::VideoTrackPrivateRemoteConfiguration::encode const): 119 (WebKit::VideoTrackPrivateRemoteConfiguration::decode): 120 * WebKit.xcodeproj/project.pbxproj: 121 * WebProcess/GPU/media/AudioTrackPrivateRemote.cpp: 122 (WebKit::AudioTrackPrivateRemote::AudioTrackPrivateRemote): 123 (WebKit::AudioTrackPrivateRemote::updateConfiguration): 124 * WebProcess/GPU/media/AudioTrackPrivateRemote.h: 125 * WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp: 126 (WebKit::MediaPlayerPrivateRemote::addRemoteAudioTrack): 127 (WebKit::MediaPlayerPrivateRemote::remoteAudioTrackConfigurationChanged): 128 (WebKit::MediaPlayerPrivateRemote::addRemoteVideoTrack): 129 (WebKit::MediaPlayerPrivateRemote::remoteVideoTrackConfigurationChanged): 130 * WebProcess/GPU/media/MediaPlayerPrivateRemote.h: 131 * WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in: 132 * WebProcess/GPU/media/VideoTrackPrivateRemote.cpp: 133 (WebKit::VideoTrackPrivateRemote::VideoTrackPrivateRemote): 134 (WebKit::VideoTrackPrivateRemote::updateConfiguration): 135 * WebProcess/GPU/media/VideoTrackPrivateRemote.h: 136 (WebKit::VideoTrackPrivateRemote::create): 137 138 LayoutTests: 139 140 Now that these properties are dynamic, test them with `testExpectedEventually`. 141 142 * media/track/audio-track-configuration.html: 143 * media/track/video-track-alternate-groups-expected.txt: 144 * media/track/video-track-configuration.html: 145 146 147 git-svn-id: https://svn.webkit.org/repository/webkit/trunk@287574 268f45cc-cd09-0410-ab3c-d52691b4dbfc 148 149 2022-01-04 Jer Noble <jer.noble@apple.com> 150 151 [Cocoa] Hang in AVTrackPrivateAVFObjCImpl::bitrate() 152 https://bugs.webkit.org/show_bug.cgi?id=234753 153 154 Reviewed by Eric Carlson. 155 156 Now that these properties are dynamic, test them with `testExpectedEventually`. 157 158 * media/track/audio-track-configuration.html: 159 * media/track/video-track-alternate-groups-expected.txt: 160 * media/track/video-track-configuration.html: 161 1 162 2021-12-13 Youenn Fablet <youenn@apple.com> 2 163 -
branches/safari-613.1.12.1-branch/LayoutTests/media/track/audio-track-configuration.html
r286908 r287576 10 10 run('video.src = "../content/audio-tracks.mp4"'); 11 11 await waitFor(video, 'canplay'); 12 testExpected('video.audioTracks.length', 0, '>');13 testExpected('video.audioTracks[0].configuration', null, '!=');14 testExpected('video.audioTracks[0].configuration.codec', 'mp4a.40.2');15 testExpected('video.audioTracks[0].configuration.sampleRate', 44100);16 testExpected('video.audioTracks[0].configuration.numberOfChannels', 2);17 testExpected('video.audioTracks[0].configuration.bitrate', 100000, '>=');12 await testExpectedEventually('video.audioTracks.length', 0, '>'); 13 await testExpectedEventually('video.audioTracks[0].configuration', null, '!='); 14 await testExpectedEventually('video.audioTracks[0].configuration.codec', 'mp4a.40.2'); 15 await testExpectedEventually('video.audioTracks[0].configuration.sampleRate', 44100); 16 await testExpectedEventually('video.audioTracks[0].configuration.numberOfChannels', 2); 17 await testExpectedEventually('video.audioTracks[0].configuration.bitrate', 100000, '>='); 18 18 endTest(); 19 19 }); -
branches/safari-613.1.12.1-branch/LayoutTests/media/track/video-track-alternate-groups-expected.txt
r198703 r287576 15 15 EVENT(canplaythrough) 16 16 EXPECTED (video.audioTracks.length == '2') OK 17 TRACK id:2 kind:main language:en 18 TRACK id:3 kind:main language:fr 17 TRACK id:2 kind:main language:eng 18 TRACK id:3 kind:main language:fra 19 19 20 20 Test that media containing six audio tracks, with three audio tracks each referring to a separate track as a fallback track, all in one alternate group, results in three AudioTracks … … 22 22 EVENT(canplaythrough) 23 23 EXPECTED (video.audioTracks.length == '3') OK 24 TRACK id: 2 kind:main language:en25 TRACK id: 4 kind:main language:fr26 TRACK id: 6 kind:main language:es24 TRACK id:3 kind:main language:eng 25 TRACK id:5 kind:main language:fra 26 TRACK id:7 kind:main language:spa 27 27 END OF TEST 28 28 -
branches/safari-613.1.12.1-branch/LayoutTests/media/track/video-track-configuration.html
r286908 r287576 10 10 run('video.src = "../content/test.mp4"'); 11 11 await waitFor(video, 'canplay'); 12 testExpected('video.videoTracks.length', 1);13 testExpected('video.videoTracks[0].configuration', null, '!=');14 testExpected('video.videoTracks[0].configuration.codec', 'avc1.4D400D');15 testExpected('video.videoTracks[0].configuration.width', 320);16 testExpected('video.videoTracks[0].configuration.height', 240);17 testExpected('video.videoTracks[0].configuration.bitrate', 240000, '>=');18 testExpected('video.videoTracks[0].configuration.framerate', 30, '>=');19 testExpected('video.videoTracks[0].configuration.colorSpace', null, '!=');20 testExpected('video.videoTracks[0].configuration.colorSpace.matrix', 'bt470bg');21 testExpected('video.videoTracks[0].configuration.colorSpace.primaries', 'smpte170m');22 testExpected('video.videoTracks[0].configuration.colorSpace.transfer', 'bt709');12 await testExpectedEventually('video.videoTracks.length', 1); 13 await testExpectedEventually('video.videoTracks[0].configuration', null, '!='); 14 await testExpectedEventually('video.videoTracks[0].configuration.codec', 'avc1.4D400D'); 15 await testExpectedEventually('video.videoTracks[0].configuration.width', 320); 16 await testExpectedEventually('video.videoTracks[0].configuration.height', 240); 17 await testExpectedEventually('video.videoTracks[0].configuration.bitrate', 240000, '>='); 18 await testExpectedEventually('video.videoTracks[0].configuration.framerate', 30, '>='); 19 await testExpectedEventually('video.videoTracks[0].configuration.colorSpace', null, '!='); 20 await testExpectedEventually('video.videoTracks[0].configuration.colorSpace.matrix', 'bt470bg'); 21 await testExpectedEventually('video.videoTracks[0].configuration.colorSpace.primaries', 'smpte170m'); 22 await testExpectedEventually('video.videoTracks[0].configuration.colorSpace.transfer', 'bt709'); 23 23 run('video.src = "../content/test-hevc.mp4"'); 24 24 await waitFor(video, 'canplay'); 25 testExpected('video.videoTracks.length', 1);26 testExpected('video.videoTracks[0].configuration', null, '!=');27 testExpected('video.videoTracks[0].configuration.codec', 'hvc1.1.6.L93.B0');28 testExpected('video.videoTracks[0].configuration.width', 320);29 testExpected('video.videoTracks[0].configuration.height', 240);30 testExpected('video.videoTracks[0].configuration.bitrate', 150000, '>=');31 testExpected('video.videoTracks[0].configuration.framerate', 30, '>=');32 testExpected('video.videoTracks[0].configuration.colorSpace', null, '!=');33 testExpected('video.videoTracks[0].configuration.colorSpace.matrix', 'bt709');34 testExpected('video.videoTracks[0].configuration.colorSpace.primaries', 'bt709');35 testExpected('video.videoTracks[0].configuration.colorSpace.transfer', 'bt709');25 await testExpectedEventually('video.videoTracks.length', 1); 26 await testExpectedEventually('video.videoTracks[0].configuration', null, '!='); 27 await testExpectedEventually('video.videoTracks[0].configuration.codec', 'hvc1.1.6.L93.B0'); 28 await testExpectedEventually('video.videoTracks[0].configuration.width', 320); 29 await testExpectedEventually('video.videoTracks[0].configuration.height', 240); 30 await testExpectedEventually('video.videoTracks[0].configuration.bitrate', 150000, '>='); 31 await testExpectedEventually('video.videoTracks[0].configuration.framerate', 30, '>='); 32 await testExpectedEventually('video.videoTracks[0].configuration.colorSpace', null, '!='); 33 await testExpectedEventually('video.videoTracks[0].configuration.colorSpace.matrix', 'bt709'); 34 await testExpectedEventually('video.videoTracks[0].configuration.colorSpace.primaries', 'bt709'); 35 await testExpectedEventually('video.videoTracks[0].configuration.colorSpace.transfer', 'bt709'); 36 36 endTest(); 37 37 }); -
branches/safari-613.1.12.1-branch/Source/WebCore/ChangeLog
r287572 r287576 1 2022-01-04 Alan Coon <alancoon@apple.com> 2 3 Cherry-pick r287574. rdar://problem/86855896 4 5 [Cocoa] Hang in AVTrackPrivateAVFObjCImpl::bitrate() 6 https://bugs.webkit.org/show_bug.cgi?id=234753 7 8 Reviewed by Eric Carlson. 9 10 Source/WebCore: 11 12 In r286908, WebCore added new queries onto existing AVAssetTrack objects; however, querying 13 those properties will block if data for those properties is not yet available. The media element 14 could block moving to the HAVE_METADATA state until those properties are fully loaded, however 15 this might regress PLT, so instead, we will check the load state of those properties before returning 16 values. 17 18 However, to make the properties exposed through VideoTrackConfiguration.idl/AudioTrackConfiguration.idl 19 dynamic, changes need to be signaled and propagated upward through the layers between AVAssetTrack and 20 the DOM. Rather than make individual notifications for each property in a Configuration struct, make one 21 notification that handles any change to the Configuration struct at all and push that upward to clients. 22 23 Since these properties are being grouped together at a lower-level, they do not need to be tracked 24 individually, and Video/AudioTrackConfigurationInit can just be aliased to a platform-defined struct. 25 26 * html/track/AudioTrack.cpp: 27 (WebCore::AudioTrack::configurationChanged): 28 (WebCore::AudioTrack::updateConfigurationFromPrivate): 29 * html/track/AudioTrack.h: 30 * html/track/AudioTrackConfiguration.h: 31 (WebCore::AudioTrackConfiguration::setState): 32 (): Deleted. 33 * html/track/VideoTrack.cpp: 34 (WebCore::VideoTrack::configurationChanged): 35 (WebCore::VideoTrack::updateConfigurationFromPrivate): 36 * html/track/VideoTrack.h: 37 * html/track/VideoTrackConfiguration.h: 38 (WebCore::VideoTrackConfiguration::setState): 39 (WebCore::VideoTrackConfiguration::colorSpace const): 40 (WebCore::VideoTrackConfiguration::setColorSpace): 41 (WebCore::VideoTrackConfiguration::VideoTrackConfiguration): 42 (): Deleted. 43 * platform/graphics/AudioTrackPrivate.h: 44 (WebCore::AudioTrackPrivate::configuration const): 45 (WebCore::AudioTrackPrivate::setConfiguration): 46 (WebCore::AudioTrackPrivate::codec const): Deleted. 47 (WebCore::AudioTrackPrivate::setCodec): Deleted. 48 (WebCore::AudioTrackPrivate::sampleRate const): Deleted. 49 (WebCore::AudioTrackPrivate::setSampleRate): Deleted. 50 (WebCore::AudioTrackPrivate::numberOfChannels const): Deleted. 51 (WebCore::AudioTrackPrivate::setNumberOfChannels): Deleted. 52 (WebCore::AudioTrackPrivate::bitrate const): Deleted. 53 (WebCore::AudioTrackPrivate::setBitrate): Deleted. 54 * platform/graphics/AudioTrackPrivateClient.h: 55 * platform/graphics/PlatformVideoColorSpace.h: 56 (WebCore::operator==): 57 (WebCore::operator!=): 58 * platform/graphics/VideoTrackPrivate.h: 59 (WebCore::VideoTrackPrivate::configuration const): 60 (WebCore::VideoTrackPrivate::setConfiguration): 61 (WebCore::VideoTrackPrivate::codec const): Deleted. 62 (WebCore::VideoTrackPrivate::setCodec): Deleted. 63 (WebCore::VideoTrackPrivate::width const): Deleted. 64 (WebCore::VideoTrackPrivate::setWidth): Deleted. 65 (WebCore::VideoTrackPrivate::height const): Deleted. 66 (WebCore::VideoTrackPrivate::setHeight): Deleted. 67 (WebCore::VideoTrackPrivate::colorSpace const): Deleted. 68 (WebCore::VideoTrackPrivate::setColorSpace): Deleted. 69 (WebCore::VideoTrackPrivate::framerate const): Deleted. 70 (WebCore::VideoTrackPrivate::setFramerate): Deleted. 71 (WebCore::VideoTrackPrivate::bitrate const): Deleted. 72 (WebCore::VideoTrackPrivate::setBitrate): Deleted. 73 * platform/graphics/VideoTrackPrivateClient.h: 74 * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.h: 75 (WebCore::AVTrackPrivateAVFObjCImpl::setVideoTrackConfigurationObserver): 76 (WebCore::AVTrackPrivateAVFObjCImpl::setAudioTrackConfigurationObserver): 77 * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.mm: 78 (WebCore::assetTrackConfigurationKeyNames): 79 (WebCore::AVTrackPrivateAVFObjCImpl::AVTrackPrivateAVFObjCImpl): 80 (WebCore::AVTrackPrivateAVFObjCImpl::initializeAssetTrack): 81 (WebCore::AVTrackPrivateAVFObjCImpl::videoTrackConfiguration const): 82 (WebCore::AVTrackPrivateAVFObjCImpl::audioTrackConfiguration const): 83 * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.h: 84 * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm: 85 (WebCore::AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC): 86 (WebCore::AudioTrackPrivateAVFObjC::resetPropertiesFromTrack): 87 (WebCore::AudioTrackPrivateAVFObjC::audioTrackConfigurationChanged): 88 * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp: 89 (WebCore::VideoTrackPrivateAVFObjC::VideoTrackPrivateAVFObjC): 90 (WebCore::VideoTrackPrivateAVFObjC::resetPropertiesFromTrack): 91 (WebCore::VideoTrackPrivateAVFObjC::videoTrackConfigurationChanged): 92 * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.h: 93 * platform/graphics/avfoundation/objc/VideoTrackPrivateMediaSourceAVFObjC.mm: 94 (WebCore::VideoTrackPrivateMediaSourceAVFObjC::resetPropertiesFromTrack): 95 * platform/graphics/cocoa/VideoTrackPrivateWebM.cpp: 96 (WebCore::VideoTrackPrivateWebM::VideoTrackPrivateWebM): 97 (WebCore::VideoTrackPrivateWebM::updateConfiguration): 98 * platform/graphics/cocoa/VideoTrackPrivateWebM.h: 99 100 Source/WebKit: 101 102 Propagate changes to TrackConfigurations upwards from the GPU process -> WebContent process. 103 104 * GPUProcess/media/AudioTrackPrivateRemoteConfiguration.h: 105 (WebKit::AudioTrackPrivateRemoteConfiguration::encode const): 106 (WebKit::AudioTrackPrivateRemoteConfiguration::decode): 107 * GPUProcess/media/RemoteAudioTrackProxy.cpp: 108 (WebKit::RemoteAudioTrackProxy::configuration): 109 (WebKit::RemoteAudioTrackProxy::configurationChanged): 110 * GPUProcess/media/RemoteAudioTrackProxy.h: 111 * GPUProcess/media/RemoteVideoTrackProxy.cpp: 112 (WebKit::RemoteVideoTrackProxy::configuration): 113 * GPUProcess/media/RemoteVideoTrackProxy.h: 114 * GPUProcess/media/TrackPrivateRemoteConfiguration.h: 115 (WebKit::TrackPrivateRemoteConfiguration::encode const): 116 (WebKit::TrackPrivateRemoteConfiguration::decode): 117 * GPUProcess/media/VideoTrackPrivateRemoteConfiguration.h: 118 (WebKit::VideoTrackPrivateRemoteConfiguration::encode const): 119 (WebKit::VideoTrackPrivateRemoteConfiguration::decode): 120 * WebKit.xcodeproj/project.pbxproj: 121 * WebProcess/GPU/media/AudioTrackPrivateRemote.cpp: 122 (WebKit::AudioTrackPrivateRemote::AudioTrackPrivateRemote): 123 (WebKit::AudioTrackPrivateRemote::updateConfiguration): 124 * WebProcess/GPU/media/AudioTrackPrivateRemote.h: 125 * WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp: 126 (WebKit::MediaPlayerPrivateRemote::addRemoteAudioTrack): 127 (WebKit::MediaPlayerPrivateRemote::remoteAudioTrackConfigurationChanged): 128 (WebKit::MediaPlayerPrivateRemote::addRemoteVideoTrack): 129 (WebKit::MediaPlayerPrivateRemote::remoteVideoTrackConfigurationChanged): 130 * WebProcess/GPU/media/MediaPlayerPrivateRemote.h: 131 * WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in: 132 * WebProcess/GPU/media/VideoTrackPrivateRemote.cpp: 133 (WebKit::VideoTrackPrivateRemote::VideoTrackPrivateRemote): 134 (WebKit::VideoTrackPrivateRemote::updateConfiguration): 135 * WebProcess/GPU/media/VideoTrackPrivateRemote.h: 136 (WebKit::VideoTrackPrivateRemote::create): 137 138 LayoutTests: 139 140 Now that these properties are dynamic, test them with `testExpectedEventually`. 141 142 * media/track/audio-track-configuration.html: 143 * media/track/video-track-alternate-groups-expected.txt: 144 * media/track/video-track-configuration.html: 145 146 147 git-svn-id: https://svn.webkit.org/repository/webkit/trunk@287574 268f45cc-cd09-0410-ab3c-d52691b4dbfc 148 149 2022-01-04 Jer Noble <jer.noble@apple.com> 150 151 [Cocoa] Hang in AVTrackPrivateAVFObjCImpl::bitrate() 152 https://bugs.webkit.org/show_bug.cgi?id=234753 153 154 Reviewed by Eric Carlson. 155 156 In r286908, WebCore added new queries onto existing AVAssetTrack objects; however, querying 157 those properties will block if data for those properties is not yet available. The media element 158 could block moving to the HAVE_METADATA state until those properties are fully loaded, however 159 this might regress PLT, so instead, we will check the load state of those properties before returning 160 values. 161 162 However, to make the properties exposed through VideoTrackConfiguration.idl/AudioTrackConfiguration.idl 163 dynamic, changes need to be signaled and propagated upward through the layers between AVAssetTrack and 164 the DOM. Rather than make individual notifications for each property in a Configuration struct, make one 165 notification that handles any change to the Configuration struct at all and push that upward to clients. 166 167 Since these properties are being grouped together at a lower-level, they do not need to be tracked 168 individually, and Video/AudioTrackConfigurationInit can just be aliased to a platform-defined struct. 169 170 * html/track/AudioTrack.cpp: 171 (WebCore::AudioTrack::configurationChanged): 172 (WebCore::AudioTrack::updateConfigurationFromPrivate): 173 * html/track/AudioTrack.h: 174 * html/track/AudioTrackConfiguration.h: 175 (WebCore::AudioTrackConfiguration::setState): 176 (): Deleted. 177 * html/track/VideoTrack.cpp: 178 (WebCore::VideoTrack::configurationChanged): 179 (WebCore::VideoTrack::updateConfigurationFromPrivate): 180 * html/track/VideoTrack.h: 181 * html/track/VideoTrackConfiguration.h: 182 (WebCore::VideoTrackConfiguration::setState): 183 (WebCore::VideoTrackConfiguration::colorSpace const): 184 (WebCore::VideoTrackConfiguration::setColorSpace): 185 (WebCore::VideoTrackConfiguration::VideoTrackConfiguration): 186 (): Deleted. 187 * platform/graphics/AudioTrackPrivate.h: 188 (WebCore::AudioTrackPrivate::configuration const): 189 (WebCore::AudioTrackPrivate::setConfiguration): 190 (WebCore::AudioTrackPrivate::codec const): Deleted. 191 (WebCore::AudioTrackPrivate::setCodec): Deleted. 192 (WebCore::AudioTrackPrivate::sampleRate const): Deleted. 193 (WebCore::AudioTrackPrivate::setSampleRate): Deleted. 194 (WebCore::AudioTrackPrivate::numberOfChannels const): Deleted. 195 (WebCore::AudioTrackPrivate::setNumberOfChannels): Deleted. 196 (WebCore::AudioTrackPrivate::bitrate const): Deleted. 197 (WebCore::AudioTrackPrivate::setBitrate): Deleted. 198 * platform/graphics/AudioTrackPrivateClient.h: 199 * platform/graphics/PlatformVideoColorSpace.h: 200 (WebCore::operator==): 201 (WebCore::operator!=): 202 * platform/graphics/VideoTrackPrivate.h: 203 (WebCore::VideoTrackPrivate::configuration const): 204 (WebCore::VideoTrackPrivate::setConfiguration): 205 (WebCore::VideoTrackPrivate::codec const): Deleted. 206 (WebCore::VideoTrackPrivate::setCodec): Deleted. 207 (WebCore::VideoTrackPrivate::width const): Deleted. 208 (WebCore::VideoTrackPrivate::setWidth): Deleted. 209 (WebCore::VideoTrackPrivate::height const): Deleted. 210 (WebCore::VideoTrackPrivate::setHeight): Deleted. 211 (WebCore::VideoTrackPrivate::colorSpace const): Deleted. 212 (WebCore::VideoTrackPrivate::setColorSpace): Deleted. 213 (WebCore::VideoTrackPrivate::framerate const): Deleted. 214 (WebCore::VideoTrackPrivate::setFramerate): Deleted. 215 (WebCore::VideoTrackPrivate::bitrate const): Deleted. 216 (WebCore::VideoTrackPrivate::setBitrate): Deleted. 217 * platform/graphics/VideoTrackPrivateClient.h: 218 * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.h: 219 (WebCore::AVTrackPrivateAVFObjCImpl::setVideoTrackConfigurationObserver): 220 (WebCore::AVTrackPrivateAVFObjCImpl::setAudioTrackConfigurationObserver): 221 * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.mm: 222 (WebCore::assetTrackConfigurationKeyNames): 223 (WebCore::AVTrackPrivateAVFObjCImpl::AVTrackPrivateAVFObjCImpl): 224 (WebCore::AVTrackPrivateAVFObjCImpl::initializeAssetTrack): 225 (WebCore::AVTrackPrivateAVFObjCImpl::videoTrackConfiguration const): 226 (WebCore::AVTrackPrivateAVFObjCImpl::audioTrackConfiguration const): 227 * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.h: 228 * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm: 229 (WebCore::AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC): 230 (WebCore::AudioTrackPrivateAVFObjC::resetPropertiesFromTrack): 231 (WebCore::AudioTrackPrivateAVFObjC::audioTrackConfigurationChanged): 232 * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp: 233 (WebCore::VideoTrackPrivateAVFObjC::VideoTrackPrivateAVFObjC): 234 (WebCore::VideoTrackPrivateAVFObjC::resetPropertiesFromTrack): 235 (WebCore::VideoTrackPrivateAVFObjC::videoTrackConfigurationChanged): 236 * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.h: 237 * platform/graphics/avfoundation/objc/VideoTrackPrivateMediaSourceAVFObjC.mm: 238 (WebCore::VideoTrackPrivateMediaSourceAVFObjC::resetPropertiesFromTrack): 239 * platform/graphics/cocoa/VideoTrackPrivateWebM.cpp: 240 (WebCore::VideoTrackPrivateWebM::VideoTrackPrivateWebM): 241 (WebCore::VideoTrackPrivateWebM::updateConfiguration): 242 * platform/graphics/cocoa/VideoTrackPrivateWebM.h: 243 1 244 2022-01-04 Russell Epstein <repstein@apple.com> 2 245 -
branches/safari-613.1.12.1-branch/Source/WebCore/Headers.cmake
r286943 r287576 1520 1520 platform/graphics/PixelBufferFormat.h 1521 1521 platform/graphics/PixelFormat.h 1522 platform/graphics/PlatformAudioTrackConfiguration.h 1522 1523 platform/graphics/PlatformColorSpace.h 1523 1524 platform/graphics/PlatformDisplay.h … … 1529 1530 platform/graphics/PlatformTextTrack.h 1530 1531 platform/graphics/PlatformTimeRanges.h 1532 platform/graphics/PlatformTrackConfiguration.h 1531 1533 platform/graphics/PlatformVideoColorPrimaries.h 1532 1534 platform/graphics/PlatformVideoColorSpace.h 1533 1535 platform/graphics/PlatformVideoMatrixCoefficients.h 1536 platform/graphics/PlatformVideoTrackConfiguration.h 1534 1537 platform/graphics/PlatformVideoTransferCharacteristics.h 1535 1538 platform/graphics/Region.h -
branches/safari-613.1.12.1-branch/Source/WebCore/Modules/webcodecs/VideoColorSpace.h
r286908 r287576 41 41 public: 42 42 static Ref<VideoColorSpace> create() { return adoptRef(*new VideoColorSpace()); }; 43 static Ref<VideoColorSpace> create(const VideoColorSpaceInit& init) { return adoptRef(*new VideoColorSpace(init)); } 43 44 static Ref<VideoColorSpace> create(VideoColorSpaceInit&& init) { return adoptRef(*new VideoColorSpace(WTFMove(init))); } 45 46 void setState(const VideoColorSpaceInit& state) { m_state = state; } 44 47 45 48 const std::optional<VideoColorPrimaries>& primaries() const { return m_state.primaries; } … … 57 60 private: 58 61 VideoColorSpace() = default; 62 VideoColorSpace(const VideoColorSpaceInit& init) 63 : m_state(init) 64 { 65 } 59 66 VideoColorSpace(VideoColorSpaceInit&& init) 60 67 : m_state(WTFMove(init)) -
branches/safari-613.1.12.1-branch/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r287145 r287576 4564 4564 CDCD41E81C3DDB0A00965D99 /* ParsedContentRange.h in Headers */ = {isa = PBXBuildFile; fileRef = CDCD41E61C3DDB0900965D99 /* ParsedContentRange.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4565 4565 CDCFABBD18C0AF78006F8450 /* HighlightData.h in Headers */ = {isa = PBXBuildFile; fileRef = CDCFABBB18C0AE31006F8450 /* HighlightData.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4566 CDD08ABD277E542600EA3755 /* PlatformTrackConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = CDD08ABC277E542600EA3755 /* PlatformTrackConfiguration.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4567 CDD08AC0277E54F000EA3755 /* PlatformAudioTrackConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = CDD08ABF277E54F000EA3755 /* PlatformAudioTrackConfiguration.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4568 CDD08AC2277E554E00EA3755 /* PlatformVideoTrackConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = CDD08AC1277E554E00EA3755 /* PlatformVideoTrackConfiguration.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4566 4569 CDD7089718359F6F002B3DC6 /* SampleMap.h in Headers */ = {isa = PBXBuildFile; fileRef = CDD7089518359F6F002B3DC6 /* SampleMap.h */; settings = {ATTRIBUTES = (Private, ); }; }; 4567 4570 CDDC1E7A18A952F30027A9D4 /* MediaSourcePrivateClient.h in Headers */ = {isa = PBXBuildFile; fileRef = CDDC1E7918A952F30027A9D4 /* MediaSourcePrivateClient.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 16107 16110 CDCFABBB18C0AE31006F8450 /* HighlightData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HighlightData.h; sourceTree = "<group>"; }; 16108 16111 CDCFABBC18C0AF19006F8450 /* HighlightData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HighlightData.cpp; sourceTree = "<group>"; }; 16112 CDD08ABC277E542600EA3755 /* PlatformTrackConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformTrackConfiguration.h; sourceTree = "<group>"; }; 16113 CDD08ABF277E54F000EA3755 /* PlatformAudioTrackConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformAudioTrackConfiguration.h; sourceTree = "<group>"; }; 16114 CDD08AC1277E554E00EA3755 /* PlatformVideoTrackConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformVideoTrackConfiguration.h; sourceTree = "<group>"; }; 16109 16115 CDD1E525167BA56400CE820B /* TextTrackRepresentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TextTrackRepresentation.h; sourceTree = "<group>"; }; 16110 16116 CDD7089418359F6E002B3DC6 /* SampleMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SampleMap.cpp; sourceTree = "<group>"; }; … … 28819 28825 BC635E90264C469F000EF33A /* PixelFormat.cpp */, 28820 28826 BCA55912263DBD79007F19B3 /* PixelFormat.h */, 28827 CDD08ABF277E54F000EA3755 /* PlatformAudioTrackConfiguration.h */, 28821 28828 BC3E62422659791700548ACD /* PlatformColorSpace.h */, 28822 28829 726D56E1253AE0430002EF90 /* PlatformImage.h */, … … 28828 28835 074E82B818A69F0E007EF54C /* PlatformTimeRanges.cpp */, 28829 28836 074E82B918A69F0E007EF54C /* PlatformTimeRanges.h */, 28837 CDD08ABC277E542600EA3755 /* PlatformTrackConfiguration.h */, 28830 28838 CD1F9AFB26FD38C900617EB6 /* PlatformVideoColorPrimaries.h */, 28831 28839 CD1F9AFA26FD385900617EB6 /* PlatformVideoColorSpace.h */, 28832 28840 CD1F9AFD26FD38CB00617EB6 /* PlatformVideoMatrixCoefficients.h */, 28841 CDD08AC1277E554E00EA3755 /* PlatformVideoTrackConfiguration.h */, 28833 28842 CD1F9AFC26FD38CA00617EB6 /* PlatformVideoTransferCharacteristics.h */, 28834 28843 BCAB417F13E356E800D8AAF3 /* Region.cpp */, … … 36310 36319 BCA55914263DBD79007F19B3 /* PixelFormat.h in Headers */, 36311 36320 CDEFA2281E7669E8000AE99C /* PlatformAudioData.h in Headers */, 36321 CDD08AC0277E54F000EA3755 /* PlatformAudioTrackConfiguration.h in Headers */, 36312 36322 499B3EDD128DB50200E726C2 /* PlatformCAAnimation.h in Headers */, 36313 36323 0F5E200618E771FC003EC3E5 /* PlatformCAAnimationCocoa.h in Headers */, … … 36341 36351 0F7D07331884C56C00B4AF86 /* PlatformTextTrack.h in Headers */, 36342 36352 074E82BB18A69F0E007EF54C /* PlatformTimeRanges.h in Headers */, 36353 CDD08ABD277E542600EA3755 /* PlatformTrackConfiguration.h in Headers */, 36343 36354 CD1F9B022700323D00617EB6 /* PlatformVideoColorPrimaries.h in Headers */, 36344 36355 CD1F9B01270020B700617EB6 /* PlatformVideoColorSpace.h in Headers */, 36345 36356 CD1F9B032700323D00617EB6 /* PlatformVideoMatrixCoefficients.h in Headers */, 36357 CDD08AC2277E554E00EA3755 /* PlatformVideoTrackConfiguration.h in Headers */, 36346 36358 CD1F9B042700323D00617EB6 /* PlatformVideoTransferCharacteristics.h in Headers */, 36347 36359 52B0D4BE1C57FD1E0077CE53 /* PlatformView.h in Headers */, -
branches/safari-613.1.12.1-branch/Source/WebCore/html/track/AudioTrack.cpp
r286908 r287576 172 172 } 173 173 174 void AudioTrack::configurationChanged(const PlatformAudioTrackConfiguration& configuration) 175 { 176 m_configuration->setState(configuration); 177 } 178 174 179 void AudioTrack::idChanged(const AtomString& id) 175 180 { … … 232 237 void AudioTrack::updateConfigurationFromPrivate() 233 238 { 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()); 239 m_configuration->setState(m_private->configuration()); 238 240 } 239 241 -
branches/safari-613.1.12.1-branch/Source/WebCore/html/track/AudioTrack.h
r286908 r287576 80 80 // AudioTrackPrivateClient 81 81 void enabledChanged(bool) final; 82 void configurationChanged(const PlatformAudioTrackConfiguration&) final; 82 83 83 84 // TrackPrivateBaseClient -
branches/safari-613.1.12.1-branch/Source/WebCore/html/track/AudioTrackConfiguration.h
r286908 r287576 28 28 #if ENABLE(VIDEO) 29 29 30 #include "PlatformAudioTrackConfiguration.h" 30 31 #include <wtf/text/WTFString.h> 31 32 32 33 namespace WebCore { 33 34 34 struct AudioTrackConfigurationInit { 35 String codec; 36 uint32_t sampleRate { 0 }; 37 uint32_t numberOfChannels { 0 }; 38 uint64_t bitrate { 0 }; 39 }; 35 using AudioTrackConfigurationInit = PlatformAudioTrackConfiguration; 40 36 41 37 class AudioTrackConfiguration : public RefCounted<AudioTrackConfiguration> { … … 44 40 static Ref<AudioTrackConfiguration> create(AudioTrackConfigurationInit&& init) { return adoptRef(*new AudioTrackConfiguration(WTFMove(init))); } 45 41 static Ref<AudioTrackConfiguration> create() { return adoptRef(*new AudioTrackConfiguration()); } 42 43 void setState(const AudioTrackConfigurationInit& state) { m_state = state; } 46 44 47 45 String codec() const { return m_state.codec; } -
branches/safari-613.1.12.1-branch/Source/WebCore/html/track/VideoTrack.cpp
r286908 r287576 165 165 } 166 166 167 void VideoTrack::configurationChanged(const PlatformVideoTrackConfiguration& configuration) 168 { 169 m_configuration->setState(configuration); 170 } 171 167 172 void VideoTrack::idChanged(const AtomString& id) 168 173 { … … 263 268 void VideoTrack::updateConfigurationFromPrivate() 264 269 { 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()); 270 m_configuration->setState(m_private->configuration()); 271 271 } 272 272 -
branches/safari-613.1.12.1-branch/Source/WebCore/html/track/VideoTrack.h
r286908 r287576 84 84 // VideoTrackPrivateClient 85 85 void selectedChanged(bool) final; 86 void configurationChanged( ) final { updateConfigurationFromPrivate(); }86 void configurationChanged(const PlatformVideoTrackConfiguration&) final; 87 87 88 88 // TrackPrivateBaseClient -
branches/safari-613.1.12.1-branch/Source/WebCore/html/track/VideoTrackConfiguration.h
r286908 r287576 28 28 #if ENABLE(VIDEO) 29 29 30 #include "PlatformVideoTrackConfiguration.h" 30 31 #include "VideoColorSpace.h" 31 32 #include <wtf/text/WTFString.h> … … 33 34 namespace WebCore { 34 35 35 struct VideoTrackConfigurationInit { 36 String codec; 37 uint32_t width { 0 }; 38 uint32_t height { 0 }; 39 RefPtr<VideoColorSpace> colorSpace; 40 double framerate { 0 }; 41 uint64_t bitrate { 0 }; 42 }; 36 using VideoTrackConfigurationInit = PlatformVideoTrackConfiguration; 43 37 44 38 class VideoTrackConfiguration : public RefCounted<VideoTrackConfiguration> { … … 47 41 static Ref<VideoTrackConfiguration> create(VideoTrackConfigurationInit&& init) { return adoptRef(*new VideoTrackConfiguration(WTFMove(init))); } 48 42 static Ref<VideoTrackConfiguration> create() { return adoptRef(*new VideoTrackConfiguration()); } 43 44 void setState(const VideoTrackConfigurationInit& state) 45 { 46 m_state = state; 47 m_colorSpace->setState(m_state.colorSpace); 48 } 49 49 50 50 String codec() const { return m_state.codec; } … … 57 57 void setHeight(uint32_t height) { m_state.height = height; } 58 58 59 Ref Ptr<VideoColorSpace> colorSpace() const { return m_state.colorSpace; }60 void setColorSpace(Ref Ptr<VideoColorSpace>&& colorSpace) { m_state.colorSpace = WTFMove(colorSpace); }59 Ref<VideoColorSpace> colorSpace() const { return m_colorSpace; } 60 void setColorSpace(Ref<VideoColorSpace>&& colorSpace) { m_colorSpace = WTFMove(colorSpace); } 61 61 62 62 double framerate() const { return m_state.framerate; } … … 69 69 VideoTrackConfiguration(VideoTrackConfigurationInit&& init) 70 70 : m_state(init) 71 , m_colorSpace(VideoColorSpace::create(init.colorSpace)) 71 72 { 72 73 } 73 VideoTrackConfiguration() = default; 74 VideoTrackConfiguration() 75 : m_colorSpace(VideoColorSpace::create()) 76 { 77 } 74 78 75 79 VideoTrackConfigurationInit m_state; 80 Ref<VideoColorSpace> m_colorSpace; 76 81 }; 77 82 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/AudioTrackPrivate.h
r286908 r287576 27 27 28 28 #include "AudioTrackPrivateClient.h" 29 #include "PlatformAudioTrackConfiguration.h" 29 30 #include "TrackPrivateBase.h" 30 31 #include <wtf/Function.h> … … 65 66 using EnabledChangedCallback = Function<void(AudioTrackPrivate&, bool enabled)>; 66 67 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; } 68 69 const PlatformAudioTrackConfiguration& configuration() const { return m_configuration; } 70 void setConfiguration(PlatformAudioTrackConfiguration&& configuration) 71 { 72 if (configuration == m_configuration) 73 return; 74 m_configuration = WTFMove(configuration); 75 if (m_client) 76 m_client->configurationChanged(m_configuration); 77 } 79 78 80 79 #if !RELEASE_LOG_DISABLED … … 88 87 WeakPtr<AudioTrackPrivateClient> m_client; 89 88 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 }; 89 PlatformAudioTrackConfiguration m_configuration; 94 90 EnabledChangedCallback m_enabledChangedCallback; 95 91 }; -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/AudioTrackPrivateClient.h
r283237 r287576 33 33 34 34 class AudioTrackPrivate; 35 struct PlatformAudioTrackConfiguration; 35 36 36 37 class AudioTrackPrivateClient : public TrackPrivateBaseClient { 37 38 public: 38 39 virtual void enabledChanged(bool) = 0; 40 virtual void configurationChanged(const PlatformAudioTrackConfiguration&) = 0; 39 41 }; 40 42 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/PlatformAudioTrackConfiguration.h
r287572 r287576 26 26 #pragma once 27 27 28 #include "PlatformVideoColorPrimaries.h" 29 #include "PlatformVideoMatrixCoefficients.h" 30 #include "PlatformVideoTransferCharacteristics.h" 31 #include <wtf/FastMalloc.h> 28 #if ENABLE(VIDEO) 29 30 #include "PlatformTrackConfiguration.h" 32 31 33 32 namespace WebCore { 34 33 35 struct 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; 34 struct PlatformAudioTrackConfiguration : PlatformTrackConfiguration { 35 uint32_t sampleRate { 0 }; 36 uint32_t numberOfChannels { 0 }; 37 uint64_t bitrate { 0 }; 38 41 39 template <class Encoder> void encode(Encoder&) const; 42 template <class Decoder> static WARN_UNUSED_RETURN bool decode(Decoder&, Platform VideoColorSpace&);40 template <class Decoder> static WARN_UNUSED_RETURN bool decode(Decoder&, PlatformAudioTrackConfiguration&); 43 41 }; 44 42 43 inline bool operator==(const PlatformAudioTrackConfiguration& a, const PlatformAudioTrackConfiguration& b) 44 { 45 return a.codec == b.codec 46 && a.sampleRate == b.sampleRate 47 && a.numberOfChannels == b.numberOfChannels 48 && a.bitrate == b.bitrate; 49 } 50 45 51 template <class Encoder> 46 void Platform VideoColorSpace::encode(Encoder& encoder) const52 void PlatformAudioTrackConfiguration::encode(Encoder& encoder) const 47 53 { 48 encoder << primaries;49 encoder << transfer;50 encoder << matrix;51 encoder << fullRange;54 encoder << codec; 55 encoder << sampleRate; 56 encoder << numberOfChannels; 57 encoder << bitrate; 52 58 } 53 59 54 60 template <class Decoder> 55 bool Platform VideoColorSpace::decode(Decoder& decoder, PlatformVideoColorSpace& colorSpace)61 bool PlatformAudioTrackConfiguration::decode(Decoder& decoder, PlatformAudioTrackConfiguration& configuration) 56 62 { 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; 63 return decoder.decode(configuration.codec) 64 && decoder.decode(configuration.sampleRate) 65 && decoder.decode(configuration.numberOfChannels) 66 && decoder.decode(configuration.bitrate); 66 67 } 67 68 68 69 } 70 71 #endif -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/PlatformTrackConfiguration.h
r287572 r287576 26 26 #pragma once 27 27 28 #i nclude "TrackPrivateBaseClient.h"28 #if ENABLE(VIDEO) 29 29 30 #i f ENABLE(VIDEO)30 #include <wtf/text/WTFString.h> 31 31 32 32 namespace WebCore { 33 33 34 class AudioTrackPrivate; 35 36 class AudioTrackPrivateClient : public TrackPrivateBaseClient { 37 public: 38 virtual void enabledChanged(bool) = 0; 34 struct PlatformTrackConfiguration { 35 String codec; 39 36 }; 40 37 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/PlatformVideoColorSpace.h
r286908 r287576 43 43 }; 44 44 45 inline bool operator==(const PlatformVideoColorSpace& a, const PlatformVideoColorSpace& b) 46 { 47 return a.primaries == b.primaries 48 && a.transfer == b.transfer 49 && a.matrix == b.matrix 50 && a.fullRange == b.fullRange; 51 } 52 53 inline bool operator!=(const PlatformVideoColorSpace& a, const PlatformVideoColorSpace& b) 54 { 55 return !(a == b); 56 } 57 45 58 template <class Encoder> 46 59 void PlatformVideoColorSpace::encode(Encoder& encoder) const -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/PlatformVideoTrackConfiguration.h
r287572 r287576 26 26 #pragma once 27 27 28 #i nclude "PlatformVideoColorPrimaries.h"29 #include "PlatformVideoMatrixCoefficients.h" 30 #include "Platform VideoTransferCharacteristics.h"31 #include <wtf/FastMalloc.h>28 #if ENABLE(VIDEO) 29 30 #include "PlatformTrackConfiguration.h" 31 #include "PlatformVideoColorSpace.h" 32 32 33 33 namespace WebCore { 34 34 35 struct 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; 35 struct PlatformVideoTrackConfiguration : PlatformTrackConfiguration { 36 uint32_t width { 0 }; 37 uint32_t height { 0 }; 38 PlatformVideoColorSpace colorSpace; 39 double framerate { 0 }; 40 uint64_t bitrate { 0 }; 41 41 42 template <class Encoder> void encode(Encoder&) const; 42 template <class Decoder> static WARN_UNUSED_RETURN bool decode(Decoder&, PlatformVideo ColorSpace&);43 template <class Decoder> static WARN_UNUSED_RETURN bool decode(Decoder&, PlatformVideoTrackConfiguration&); 43 44 }; 44 45 46 inline bool operator==(const PlatformVideoTrackConfiguration& a, const PlatformVideoTrackConfiguration& b) 47 { 48 return a.codec == b.codec 49 && a.width == b.width 50 && a.height == b.height 51 && a.colorSpace == b.colorSpace 52 && a.framerate == b.framerate 53 && a.bitrate == b.bitrate; 54 } 55 45 56 template <class Encoder> 46 void PlatformVideo ColorSpace::encode(Encoder& encoder) const57 void PlatformVideoTrackConfiguration::encode(Encoder& encoder) const 47 58 { 48 encoder << primaries; 49 encoder << transfer; 50 encoder << matrix; 51 encoder << fullRange; 59 encoder << codec; 60 encoder << width; 61 encoder << height; 62 encoder << colorSpace; 63 encoder << framerate; 64 encoder << bitrate; 52 65 } 53 66 54 67 template <class Decoder> 55 bool PlatformVideo ColorSpace::decode(Decoder& decoder, PlatformVideoColorSpace& colorSpace)68 bool PlatformVideoTrackConfiguration::decode(Decoder& decoder, PlatformVideoTrackConfiguration& configuration) 56 69 { 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; 70 return decoder.decode(configuration.codec) 71 && decoder.decode(configuration.width) 72 && decoder.decode(configuration.height) 73 && decoder.decode(configuration.colorSpace) 74 && decoder.decode(configuration.framerate) 75 && decoder.decode(configuration.bitrate); 66 76 } 67 77 68 78 } 79 80 #endif -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/VideoTrackPrivate.h
r286908 r287576 28 28 #if ENABLE(VIDEO) 29 29 30 #include "PlatformVideo ColorSpace.h"30 #include "PlatformVideoTrackConfiguration.h" 31 31 #include "TrackPrivateBase.h" 32 32 #include "VideoTrackPrivateClient.h" … … 63 63 void setSelectedChangedCallback(SelectedChangedCallback&& callback) { m_selectedChangedCallback = WTFMove(callback); } 64 64 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 65 const PlatformVideoTrackConfiguration& configuration() const { return m_configuration; } 66 void setConfiguration(PlatformVideoTrackConfiguration&& configuration) 67 { 68 if (configuration == m_configuration) 69 return; 70 m_configuration = WTFMove(configuration); 71 if (m_client) 72 m_client->configurationChanged(m_configuration); 73 } 74 83 75 protected: 84 76 VideoTrackPrivate() = default; … … 87 79 WeakPtr<VideoTrackPrivateClient> m_client { nullptr }; 88 80 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 }; 81 PlatformVideoTrackConfiguration m_configuration; 95 82 96 83 SelectedChangedCallback m_selectedChangedCallback; -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/VideoTrackPrivateClient.h
r286908 r287576 32 32 namespace WebCore { 33 33 34 struct PlatformVideoTrackConfiguration; 35 34 36 class VideoTrackPrivateClient : public TrackPrivateBaseClient { 35 37 public: 36 38 virtual void selectedChanged(bool) = 0; 37 virtual void configurationChanged( ) = 0;39 virtual void configurationChanged(const PlatformVideoTrackConfiguration&) = 0; 38 40 }; 39 41 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.h
r286908 r287576 32 32 #include "PlatformVideoColorSpace.h" 33 33 #include "VideoTrackPrivate.h" 34 #include <wtf/Observer.h> 34 35 #include <wtf/Ref.h> 35 36 #include <wtf/RetainPtr.h> … … 46 47 47 48 class MediaSelectionOptionAVFObjC; 49 struct PlatformVideoTrackConfiguration; 50 struct PlatformAudioTrackConfiguration; 48 51 49 class AVTrackPrivateAVFObjCImpl {52 class AVTrackPrivateAVFObjCImpl : public CanMakeWeakPtr<AVTrackPrivateAVFObjCImpl> { 50 53 WTF_MAKE_FAST_ALLOCATED; 51 54 public: … … 72 75 int trackID() const; 73 76 77 static String languageForAVAssetTrack(AVAssetTrack*); 78 static String languageForAVMediaSelectionOption(AVMediaSelectionOption *); 79 80 PlatformVideoTrackConfiguration videoTrackConfiguration() const; 81 using VideoTrackConfigurationObserver = Observer<void()>; 82 void setVideoTrackConfigurationObserver(VideoTrackConfigurationObserver& observer) { m_videoTrackConfigurationObserver = observer; } 83 84 PlatformAudioTrackConfiguration audioTrackConfiguration() const; 85 using AudioTrackConfigurationObserver = Observer<void()>; 86 void setAudioTrackConfigurationObserver(AudioTrackConfigurationObserver& observer) { m_audioTrackConfigurationObserver = observer; } 87 88 private: 89 void initializeAssetTrack(); 90 74 91 String codec() const; 75 92 uint32_t width() const; … … 80 97 uint32_t sampleRate() const; 81 98 uint32_t numberOfChannels() const; 82 static String languageForAVAssetTrack(AVAssetTrack*);83 static String languageForAVMediaSelectionOption(AVMediaSelectionOption *);84 99 85 private:86 100 RetainPtr<AVPlayerItemTrack> m_playerItemTrack; 87 RetainPtr<AVAssetTrack> m_assetTrack;88 101 RetainPtr<AVPlayerItem> m_playerItem; 89 102 RefPtr<MediaSelectionOptionAVFObjC> m_mediaSelectionOption; 103 RetainPtr<AVAssetTrack> m_assetTrack; 104 WeakPtr<VideoTrackConfigurationObserver> m_videoTrackConfigurationObserver; 105 WeakPtr<AudioTrackConfigurationObserver> m_audioTrackConfigurationObserver; 90 106 }; 91 107 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.mm
r286908 r287576 31 31 #import "FormatDescriptionUtilities.h" 32 32 #import "MediaSelectionGroupAVFObjC.h" 33 #import "PlatformAudioTrackConfiguration.h" 34 #import "PlatformVideoTrackConfiguration.h" 33 35 #import "SharedBuffer.h" 34 36 #import <AVFoundation/AVAssetTrack.h> … … 38 40 #import <AVFoundation/AVPlayerItemTrack.h> 39 41 #import <objc/runtime.h> 42 #import <wtf/RunLoop.h> 40 43 41 44 #import <pal/cf/CoreMediaSoftLink.h> … … 49 52 namespace WebCore { 50 53 54 static NSArray* assetTrackConfigurationKeyNames() 55 { 56 static NSArray* keys = [[NSArray alloc] initWithObjects:@"formatDescriptions", @"estimatedDataRate", @"nominalFrameRate", nil]; 57 return keys; 58 } 59 51 60 AVTrackPrivateAVFObjCImpl::AVTrackPrivateAVFObjCImpl(AVPlayerItemTrack* track) 52 61 : m_playerItemTrack(track) 53 62 , m_assetTrack([track assetTrack]) 54 63 { 64 initializeAssetTrack(); 55 65 } 56 66 … … 58 68 : m_assetTrack(track) 59 69 { 70 initializeAssetTrack(); 60 71 } 61 72 62 73 AVTrackPrivateAVFObjCImpl::AVTrackPrivateAVFObjCImpl(MediaSelectionOptionAVFObjC& option) 63 74 : m_mediaSelectionOption(&option) 64 { 75 , m_assetTrack(option.assetTrack()) 76 { 77 initializeAssetTrack(); 65 78 } 66 79 67 80 AVTrackPrivateAVFObjCImpl::~AVTrackPrivateAVFObjCImpl() 68 81 { 82 } 83 84 void AVTrackPrivateAVFObjCImpl::initializeAssetTrack() 85 { 86 if (!m_assetTrack) 87 return; 88 89 [m_assetTrack loadValuesAsynchronouslyForKeys:assetTrackConfigurationKeyNames() completionHandler:[weakThis = WeakPtr(this)] () mutable { 90 callOnMainRunLoop([weakThis = WTFMove(weakThis)] { 91 if (weakThis && weakThis->m_audioTrackConfigurationObserver) 92 (*weakThis->m_audioTrackConfigurationObserver)(); 93 if (weakThis && weakThis->m_videoTrackConfigurationObserver) 94 (*weakThis->m_videoTrackConfigurationObserver)(); 95 }); 96 }]; 69 97 } 70 98 … … 233 261 } 234 262 263 PlatformVideoTrackConfiguration AVTrackPrivateAVFObjCImpl::videoTrackConfiguration() const 264 { 265 return { 266 { codec() }, 267 width(), 268 height(), 269 colorSpace(), 270 framerate(), 271 bitrate(), 272 }; 273 } 274 275 PlatformAudioTrackConfiguration AVTrackPrivateAVFObjCImpl::audioTrackConfiguration() const 276 { 277 return { 278 { codec() }, 279 sampleRate(), 280 numberOfChannels(), 281 bitrate(), 282 }; 283 } 284 235 285 int AVTrackPrivateAVFObjCImpl::trackID() const 236 286 { … … 257 307 { 258 308 auto assetTrack = assetTrackFor(impl); 259 if (!assetTrack || !assetTrack.formatDescriptions.count)309 if (!assetTrack || [assetTrack statusOfValueForKey:@"formatDescriptions" error:nil] != AVKeyValueStatusLoaded || !assetTrack.formatDescriptions.count) 260 310 return nullptr; 261 311 return static_cast<CMFormatDescriptionRef>(assetTrack.formatDescriptions[0]); … … 292 342 double AVTrackPrivateAVFObjCImpl::framerate() const 293 343 { 294 if (auto assetTrack = assetTrackFor(*this)) 295 return assetTrack.nominalFrameRate; 296 ASSERT_NOT_REACHED(); 297 return 0; 344 auto assetTrack = assetTrackFor(*this); 345 if (!assetTrack) 346 return 0; 347 if ([assetTrack statusOfValueForKey:@"nominalFrameRate" error:nil] != AVKeyValueStatusLoaded) 348 return 0; 349 return assetTrack.nominalFrameRate; 298 350 } 299 351 … … 329 381 if (!assetTrack) 330 382 return 0; 383 if ([assetTrack statusOfValueForKey:@"estimatedDataRate" error:nil] != AVKeyValueStatusLoaded) 384 return 0; 331 385 if (!std::isfinite(assetTrack.estimatedDataRate)) 332 386 return 0; -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.h
r262695 r287576 30 30 31 31 #include "AudioTrackPrivateAVF.h" 32 #include <wtf/Observer.h> 32 33 33 34 OBJC_CLASS AVAssetTrack; … … 76 77 AudioTrackPrivateAVFObjC(AVAssetTrack*); 77 78 AudioTrackPrivateAVFObjC(MediaSelectionOptionAVFObjC&); 79 AudioTrackPrivateAVFObjC(std::unique_ptr<AVTrackPrivateAVFObjCImpl>&&); 78 80 79 81 void resetPropertiesFromTrack(); 82 void audioTrackConfigurationChanged(); 80 83 std::unique_ptr<AVTrackPrivateAVFObjCImpl> m_impl; 84 85 using AudioTrackConfigurationObserver = Observer<void()>; 86 AudioTrackConfigurationObserver m_audioTrackConfigurationObserver; 81 87 }; 82 88 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm
r286908 r287576 34 34 35 35 AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC(AVPlayerItemTrack* track) 36 : m_impl(makeUnique<AVTrackPrivateAVFObjCImpl>(track))36 : AudioTrackPrivateAVFObjC(makeUnique<AVTrackPrivateAVFObjCImpl>(track)) 37 37 { 38 } 39 40 AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC(AVAssetTrack* track) 41 : AudioTrackPrivateAVFObjC(makeUnique<AVTrackPrivateAVFObjCImpl>(track)) 42 { 43 } 44 45 AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC(MediaSelectionOptionAVFObjC& option) 46 : AudioTrackPrivateAVFObjC(makeUnique<AVTrackPrivateAVFObjCImpl>(option)) 47 { 48 } 49 50 AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC(std::unique_ptr<AVTrackPrivateAVFObjCImpl>&& impl) 51 : m_impl(WTFMove(impl)) 52 , m_audioTrackConfigurationObserver([this] { audioTrackConfigurationChanged(); }) 53 { 54 m_impl->setAudioTrackConfigurationObserver(m_audioTrackConfigurationObserver); 38 55 resetPropertiesFromTrack(); 39 56 } 40 57 41 AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC(MediaSelectionOptionAVFObjC& option)42 : m_impl(makeUnique<AVTrackPrivateAVFObjCImpl>(option))43 {44 resetPropertiesFromTrack();45 }46 58 47 59 void AudioTrackPrivateAVFObjC::resetPropertiesFromTrack() … … 56 68 setLabel(m_impl->label()); 57 69 setLanguage(m_impl->language()); 58 setCodec(m_impl->codec()); 59 setSampleRate(m_impl->sampleRate()); 60 setNumberOfChannels(m_impl->numberOfChannels()); 61 setBitrate(m_impl->bitrate()); 70 setConfiguration(m_impl->audioTrackConfiguration()); 71 } 62 72 73 void AudioTrackPrivateAVFObjC::audioTrackConfigurationChanged() 74 { 75 setConfiguration(m_impl->audioTrackConfiguration()); 63 76 } 64 77 … … 72 85 { 73 86 return m_impl->playerItemTrack(); 74 }75 76 AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC(AVAssetTrack* track)77 : m_impl(makeUnique<AVTrackPrivateAVFObjCImpl>(track))78 {79 resetPropertiesFromTrack();80 87 } 81 88 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp
r286908 r287576 31 31 #import "AVTrackPrivateAVFObjCImpl.h" 32 32 #import "MediaSelectionGroupAVFObjC.h" 33 #import "PlatformVideoTrackConfiguration.h" 33 34 34 35 namespace WebCore { 35 36 36 37 VideoTrackPrivateAVFObjC::VideoTrackPrivateAVFObjC(AVPlayerItemTrack* track) 37 : m_impl(makeUnique<AVTrackPrivateAVFObjCImpl>(track))38 : VideoTrackPrivateAVFObjC(makeUnique<AVTrackPrivateAVFObjCImpl>(track)) 38 39 { 39 resetPropertiesFromTrack();40 40 } 41 41 42 42 VideoTrackPrivateAVFObjC::VideoTrackPrivateAVFObjC(AVAssetTrack* track) 43 : m_impl(makeUnique<AVTrackPrivateAVFObjCImpl>(track))43 : VideoTrackPrivateAVFObjC(makeUnique<AVTrackPrivateAVFObjCImpl>(track)) 44 44 { 45 resetPropertiesFromTrack();46 45 } 47 46 48 47 VideoTrackPrivateAVFObjC::VideoTrackPrivateAVFObjC(MediaSelectionOptionAVFObjC& option) 49 : m_impl(makeUnique<AVTrackPrivateAVFObjCImpl>(option))48 : VideoTrackPrivateAVFObjC(makeUnique<AVTrackPrivateAVFObjCImpl>(option)) 50 49 { 50 } 51 52 VideoTrackPrivateAVFObjC::VideoTrackPrivateAVFObjC(std::unique_ptr<AVTrackPrivateAVFObjCImpl>&& impl) 53 : m_impl(WTFMove(impl)) 54 , m_videoTrackConfigurationObserver([this] { videoTrackConfigurationChanged(); }) 55 { 56 m_impl->setVideoTrackConfigurationObserver(m_videoTrackConfigurationObserver); 51 57 resetPropertiesFromTrack(); 52 58 } … … 63 69 setLabel(m_impl->label()); 64 70 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 setConfiguration(m_impl->videoTrackConfiguration()); 72 } 71 73 72 if (auto* client = this->client()) 73 client->configurationChanged(); 74 void VideoTrackPrivateAVFObjC::videoTrackConfigurationChanged() 75 { 76 setConfiguration(m_impl->videoTrackConfiguration()); 74 77 } 75 78 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.h
r284770 r287576 30 30 31 31 #include "VideoTrackPrivateAVF.h" 32 #include <wtf/Observer.h> 32 33 33 34 OBJC_CLASS AVAssetTrack; … … 76 77 explicit VideoTrackPrivateAVFObjC(AVAssetTrack*); 77 78 explicit VideoTrackPrivateAVFObjC(MediaSelectionOptionAVFObjC&); 79 explicit VideoTrackPrivateAVFObjC(std::unique_ptr<AVTrackPrivateAVFObjCImpl>&&); 78 80 79 81 void resetPropertiesFromTrack(); 82 void videoTrackConfigurationChanged(); 80 83 std::unique_ptr<AVTrackPrivateAVFObjCImpl> m_impl; 84 85 using VideoTrackConfigurationObserver = Observer<void()>; 86 VideoTrackConfigurationObserver m_videoTrackConfigurationObserver; 81 87 }; 82 88 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/avfoundation/objc/VideoTrackPrivateMediaSourceAVFObjC.mm
r286908 r287576 51 51 setLabel(m_impl->label()); 52 52 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()); 53 setConfiguration(m_impl->videoTrackConfiguration()); 59 54 } 60 55 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/cocoa/VideoTrackPrivateWebM.cpp
r286908 r287576 41 41 if (m_track.is_enabled.is_present()) 42 42 setSelected(m_track.is_enabled.value()); 43 44 updateConfiguration(); 43 45 } 44 46 … … 146 148 } 147 149 150 void VideoTrackPrivateWebM::updateConfiguration() 151 { 152 PlatformVideoTrackConfiguration configuration { 153 { .codec = codec() }, 154 .width = width(), 155 .height = height(), 156 .framerate = framerate(), 157 }; 158 setConfiguration(WTFMove(configuration)); 159 } 160 148 161 } 149 162 -
branches/safari-613.1.12.1-branch/Source/WebCore/platform/graphics/cocoa/VideoTrackPrivateWebM.h
r286908 r287576 44 44 std::optional<uint64_t> trackUID() const final; 45 45 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;50 46 51 47 private: 52 48 VideoTrackPrivateWebM(webm::TrackEntry&&); 49 50 String codec() const; 51 uint32_t width() const; 52 uint32_t height() const; 53 double framerate() const; 54 void updateConfiguration(); 55 53 56 webm::TrackEntry m_track; 54 57 mutable AtomString m_trackID; -
branches/safari-613.1.12.1-branch/Source/WebKit/ChangeLog
r287149 r287576 1 2022-01-04 Alan Coon <alancoon@apple.com> 2 3 Cherry-pick r287574. rdar://problem/86855896 4 5 [Cocoa] Hang in AVTrackPrivateAVFObjCImpl::bitrate() 6 https://bugs.webkit.org/show_bug.cgi?id=234753 7 8 Reviewed by Eric Carlson. 9 10 Source/WebCore: 11 12 In r286908, WebCore added new queries onto existing AVAssetTrack objects; however, querying 13 those properties will block if data for those properties is not yet available. The media element 14 could block moving to the HAVE_METADATA state until those properties are fully loaded, however 15 this might regress PLT, so instead, we will check the load state of those properties before returning 16 values. 17 18 However, to make the properties exposed through VideoTrackConfiguration.idl/AudioTrackConfiguration.idl 19 dynamic, changes need to be signaled and propagated upward through the layers between AVAssetTrack and 20 the DOM. Rather than make individual notifications for each property in a Configuration struct, make one 21 notification that handles any change to the Configuration struct at all and push that upward to clients. 22 23 Since these properties are being grouped together at a lower-level, they do not need to be tracked 24 individually, and Video/AudioTrackConfigurationInit can just be aliased to a platform-defined struct. 25 26 * html/track/AudioTrack.cpp: 27 (WebCore::AudioTrack::configurationChanged): 28 (WebCore::AudioTrack::updateConfigurationFromPrivate): 29 * html/track/AudioTrack.h: 30 * html/track/AudioTrackConfiguration.h: 31 (WebCore::AudioTrackConfiguration::setState): 32 (): Deleted. 33 * html/track/VideoTrack.cpp: 34 (WebCore::VideoTrack::configurationChanged): 35 (WebCore::VideoTrack::updateConfigurationFromPrivate): 36 * html/track/VideoTrack.h: 37 * html/track/VideoTrackConfiguration.h: 38 (WebCore::VideoTrackConfiguration::setState): 39 (WebCore::VideoTrackConfiguration::colorSpace const): 40 (WebCore::VideoTrackConfiguration::setColorSpace): 41 (WebCore::VideoTrackConfiguration::VideoTrackConfiguration): 42 (): Deleted. 43 * platform/graphics/AudioTrackPrivate.h: 44 (WebCore::AudioTrackPrivate::configuration const): 45 (WebCore::AudioTrackPrivate::setConfiguration): 46 (WebCore::AudioTrackPrivate::codec const): Deleted. 47 (WebCore::AudioTrackPrivate::setCodec): Deleted. 48 (WebCore::AudioTrackPrivate::sampleRate const): Deleted. 49 (WebCore::AudioTrackPrivate::setSampleRate): Deleted. 50 (WebCore::AudioTrackPrivate::numberOfChannels const): Deleted. 51 (WebCore::AudioTrackPrivate::setNumberOfChannels): Deleted. 52 (WebCore::AudioTrackPrivate::bitrate const): Deleted. 53 (WebCore::AudioTrackPrivate::setBitrate): Deleted. 54 * platform/graphics/AudioTrackPrivateClient.h: 55 * platform/graphics/PlatformVideoColorSpace.h: 56 (WebCore::operator==): 57 (WebCore::operator!=): 58 * platform/graphics/VideoTrackPrivate.h: 59 (WebCore::VideoTrackPrivate::configuration const): 60 (WebCore::VideoTrackPrivate::setConfiguration): 61 (WebCore::VideoTrackPrivate::codec const): Deleted. 62 (WebCore::VideoTrackPrivate::setCodec): Deleted. 63 (WebCore::VideoTrackPrivate::width const): Deleted. 64 (WebCore::VideoTrackPrivate::setWidth): Deleted. 65 (WebCore::VideoTrackPrivate::height const): Deleted. 66 (WebCore::VideoTrackPrivate::setHeight): Deleted. 67 (WebCore::VideoTrackPrivate::colorSpace const): Deleted. 68 (WebCore::VideoTrackPrivate::setColorSpace): Deleted. 69 (WebCore::VideoTrackPrivate::framerate const): Deleted. 70 (WebCore::VideoTrackPrivate::setFramerate): Deleted. 71 (WebCore::VideoTrackPrivate::bitrate const): Deleted. 72 (WebCore::VideoTrackPrivate::setBitrate): Deleted. 73 * platform/graphics/VideoTrackPrivateClient.h: 74 * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.h: 75 (WebCore::AVTrackPrivateAVFObjCImpl::setVideoTrackConfigurationObserver): 76 (WebCore::AVTrackPrivateAVFObjCImpl::setAudioTrackConfigurationObserver): 77 * platform/graphics/avfoundation/AVTrackPrivateAVFObjCImpl.mm: 78 (WebCore::assetTrackConfigurationKeyNames): 79 (WebCore::AVTrackPrivateAVFObjCImpl::AVTrackPrivateAVFObjCImpl): 80 (WebCore::AVTrackPrivateAVFObjCImpl::initializeAssetTrack): 81 (WebCore::AVTrackPrivateAVFObjCImpl::videoTrackConfiguration const): 82 (WebCore::AVTrackPrivateAVFObjCImpl::audioTrackConfiguration const): 83 * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.h: 84 * platform/graphics/avfoundation/objc/AudioTrackPrivateAVFObjC.mm: 85 (WebCore::AudioTrackPrivateAVFObjC::AudioTrackPrivateAVFObjC): 86 (WebCore::AudioTrackPrivateAVFObjC::resetPropertiesFromTrack): 87 (WebCore::AudioTrackPrivateAVFObjC::audioTrackConfigurationChanged): 88 * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.cpp: 89 (WebCore::VideoTrackPrivateAVFObjC::VideoTrackPrivateAVFObjC): 90 (WebCore::VideoTrackPrivateAVFObjC::resetPropertiesFromTrack): 91 (WebCore::VideoTrackPrivateAVFObjC::videoTrackConfigurationChanged): 92 * platform/graphics/avfoundation/objc/VideoTrackPrivateAVFObjC.h: 93 * platform/graphics/avfoundation/objc/VideoTrackPrivateMediaSourceAVFObjC.mm: 94 (WebCore::VideoTrackPrivateMediaSourceAVFObjC::resetPropertiesFromTrack): 95 * platform/graphics/cocoa/VideoTrackPrivateWebM.cpp: 96 (WebCore::VideoTrackPrivateWebM::VideoTrackPrivateWebM): 97 (WebCore::VideoTrackPrivateWebM::updateConfiguration): 98 * platform/graphics/cocoa/VideoTrackPrivateWebM.h: 99 100 Source/WebKit: 101 102 Propagate changes to TrackConfigurations upwards from the GPU process -> WebContent process. 103 104 * GPUProcess/media/AudioTrackPrivateRemoteConfiguration.h: 105 (WebKit::AudioTrackPrivateRemoteConfiguration::encode const): 106 (WebKit::AudioTrackPrivateRemoteConfiguration::decode): 107 * GPUProcess/media/RemoteAudioTrackProxy.cpp: 108 (WebKit::RemoteAudioTrackProxy::configuration): 109 (WebKit::RemoteAudioTrackProxy::configurationChanged): 110 * GPUProcess/media/RemoteAudioTrackProxy.h: 111 * GPUProcess/media/RemoteVideoTrackProxy.cpp: 112 (WebKit::RemoteVideoTrackProxy::configuration): 113 * GPUProcess/media/RemoteVideoTrackProxy.h: 114 * GPUProcess/media/TrackPrivateRemoteConfiguration.h: 115 (WebKit::TrackPrivateRemoteConfiguration::encode const): 116 (WebKit::TrackPrivateRemoteConfiguration::decode): 117 * GPUProcess/media/VideoTrackPrivateRemoteConfiguration.h: 118 (WebKit::VideoTrackPrivateRemoteConfiguration::encode const): 119 (WebKit::VideoTrackPrivateRemoteConfiguration::decode): 120 * WebKit.xcodeproj/project.pbxproj: 121 * WebProcess/GPU/media/AudioTrackPrivateRemote.cpp: 122 (WebKit::AudioTrackPrivateRemote::AudioTrackPrivateRemote): 123 (WebKit::AudioTrackPrivateRemote::updateConfiguration): 124 * WebProcess/GPU/media/AudioTrackPrivateRemote.h: 125 * WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp: 126 (WebKit::MediaPlayerPrivateRemote::addRemoteAudioTrack): 127 (WebKit::MediaPlayerPrivateRemote::remoteAudioTrackConfigurationChanged): 128 (WebKit::MediaPlayerPrivateRemote::addRemoteVideoTrack): 129 (WebKit::MediaPlayerPrivateRemote::remoteVideoTrackConfigurationChanged): 130 * WebProcess/GPU/media/MediaPlayerPrivateRemote.h: 131 * WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in: 132 * WebProcess/GPU/media/VideoTrackPrivateRemote.cpp: 133 (WebKit::VideoTrackPrivateRemote::VideoTrackPrivateRemote): 134 (WebKit::VideoTrackPrivateRemote::updateConfiguration): 135 * WebProcess/GPU/media/VideoTrackPrivateRemote.h: 136 (WebKit::VideoTrackPrivateRemote::create): 137 138 LayoutTests: 139 140 Now that these properties are dynamic, test them with `testExpectedEventually`. 141 142 * media/track/audio-track-configuration.html: 143 * media/track/video-track-alternate-groups-expected.txt: 144 * media/track/video-track-configuration.html: 145 146 147 git-svn-id: https://svn.webkit.org/repository/webkit/trunk@287574 268f45cc-cd09-0410-ab3c-d52691b4dbfc 148 149 2022-01-04 Jer Noble <jer.noble@apple.com> 150 151 [Cocoa] Hang in AVTrackPrivateAVFObjCImpl::bitrate() 152 https://bugs.webkit.org/show_bug.cgi?id=234753 153 154 Reviewed by Eric Carlson. 155 156 Propagate changes to TrackConfigurations upwards from the GPU process -> WebContent process. 157 158 * GPUProcess/media/AudioTrackPrivateRemoteConfiguration.h: 159 (WebKit::AudioTrackPrivateRemoteConfiguration::encode const): 160 (WebKit::AudioTrackPrivateRemoteConfiguration::decode): 161 * GPUProcess/media/RemoteAudioTrackProxy.cpp: 162 (WebKit::RemoteAudioTrackProxy::configuration): 163 (WebKit::RemoteAudioTrackProxy::configurationChanged): 164 * GPUProcess/media/RemoteAudioTrackProxy.h: 165 * GPUProcess/media/RemoteVideoTrackProxy.cpp: 166 (WebKit::RemoteVideoTrackProxy::configuration): 167 * GPUProcess/media/RemoteVideoTrackProxy.h: 168 * GPUProcess/media/TrackPrivateRemoteConfiguration.h: 169 (WebKit::TrackPrivateRemoteConfiguration::encode const): 170 (WebKit::TrackPrivateRemoteConfiguration::decode): 171 * GPUProcess/media/VideoTrackPrivateRemoteConfiguration.h: 172 (WebKit::VideoTrackPrivateRemoteConfiguration::encode const): 173 (WebKit::VideoTrackPrivateRemoteConfiguration::decode): 174 * WebKit.xcodeproj/project.pbxproj: 175 * WebProcess/GPU/media/AudioTrackPrivateRemote.cpp: 176 (WebKit::AudioTrackPrivateRemote::AudioTrackPrivateRemote): 177 (WebKit::AudioTrackPrivateRemote::updateConfiguration): 178 * WebProcess/GPU/media/AudioTrackPrivateRemote.h: 179 * WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp: 180 (WebKit::MediaPlayerPrivateRemote::addRemoteAudioTrack): 181 (WebKit::MediaPlayerPrivateRemote::remoteAudioTrackConfigurationChanged): 182 (WebKit::MediaPlayerPrivateRemote::addRemoteVideoTrack): 183 (WebKit::MediaPlayerPrivateRemote::remoteVideoTrackConfigurationChanged): 184 * WebProcess/GPU/media/MediaPlayerPrivateRemote.h: 185 * WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in: 186 * WebProcess/GPU/media/VideoTrackPrivateRemote.cpp: 187 (WebKit::VideoTrackPrivateRemote::VideoTrackPrivateRemote): 188 (WebKit::VideoTrackPrivateRemote::updateConfiguration): 189 * WebProcess/GPU/media/VideoTrackPrivateRemote.h: 190 (WebKit::VideoTrackPrivateRemote::create): 191 1 192 2021-12-16 Alan Coon <alancoon@apple.com> 2 193 -
branches/safari-613.1.12.1-branch/Source/WebKit/GPUProcess/media/AudioTrackPrivateRemoteConfiguration.h
r287572 r287576 26 26 #pragma once 27 27 28 #i nclude "TrackPrivateBaseClient.h"28 #if ENABLE(GPU_PROCESS) 29 29 30 #if ENABLE(VIDEO) 30 #include "TrackPrivateRemoteConfiguration.h" 31 #include <WebCore/AudioTrackPrivate.h> 31 32 32 namespace Web Core{33 namespace WebKit { 33 34 34 class AudioTrackPrivate; 35 struct AudioTrackPrivateRemoteConfiguration : TrackPrivateRemoteConfiguration { 36 bool enabled; 37 WebCore::AudioTrackPrivate::Kind kind { WebCore::AudioTrackPrivate::Kind::None }; 38 WebCore::PlatformAudioTrackConfiguration trackConfiguration; 35 39 36 class AudioTrackPrivateClient : public TrackPrivateBaseClient { 37 public: 38 virtual void enabledChanged(bool) = 0; 40 template<class Encoder> 41 void encode(Encoder& encoder) const 42 { 43 TrackPrivateRemoteConfiguration::encode(encoder); 44 encoder << enabled; 45 encoder << kind; 46 encoder << trackConfiguration; 47 } 48 49 template <class Decoder> 50 static bool WARN_UNUSED_RETURN decode(Decoder& decoder, AudioTrackPrivateRemoteConfiguration& configuration) 51 { 52 return TrackPrivateRemoteConfiguration::decode(decoder, configuration) 53 && decoder.decode(configuration.enabled) 54 && decoder.decode(configuration.kind) 55 && decoder.decode(configuration.trackConfiguration); 56 } 39 57 }; 40 58 41 } 59 } // namespace WebKit 42 60 43 61 #endif -
branches/safari-613.1.12.1-branch/Source/WebKit/GPUProcess/media/RemoteAudioTrackProxy.cpp
r286908 r287576 30 30 #if ENABLE(GPU_PROCESS) 31 31 32 #include "AudioTrackPrivateRemoteConfiguration.h" 32 33 #include "Connection.h" 33 34 #include "GPUConnectionToWebProcess.h" 34 35 #include "MediaPlayerPrivateRemoteMessages.h" 35 36 #include "RemoteMediaPlayerProxy.h" 36 #include "TrackPrivateRemoteConfiguration.h"37 37 38 38 namespace WebKit { … … 55 55 } 56 56 57 TrackPrivateRemoteConfiguration RemoteAudioTrackProxy::configuration()57 AudioTrackPrivateRemoteConfiguration RemoteAudioTrackProxy::configuration() 58 58 { 59 59 return { 60 m_trackPrivate->id(), 61 m_trackPrivate->label(), 62 m_trackPrivate->language(), 63 m_trackPrivate->startTimeVariance(), 64 m_trackPrivate->trackIndex(), 60 { 61 m_trackPrivate->id(), 62 m_trackPrivate->label(), 63 m_trackPrivate->language(), 64 m_trackPrivate->startTimeVariance(), 65 m_trackPrivate->trackIndex(), 66 }, 65 67 m_trackPrivate->enabled(), 66 68 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(), 69 m_trackPrivate->configuration(), 77 70 }; 78 71 } … … 99 92 } 100 93 94 void RemoteAudioTrackProxy::configurationChanged(const PlatformAudioTrackConfiguration& configuration) 95 { 96 configurationChanged(); 97 } 98 101 99 void RemoteAudioTrackProxy::idChanged(const AtomString&) 102 100 { -
branches/safari-613.1.12.1-branch/Source/WebKit/GPUProcess/media/RemoteAudioTrackProxy.h
r286908 r287576 45 45 46 46 class GPUConnectionToWebProcess; 47 struct TrackPrivateRemoteConfiguration;47 struct AudioTrackPrivateRemoteConfiguration; 48 48 49 49 class RemoteAudioTrackProxy final … … 70 70 // AudioTrackPrivateClient 71 71 void enabledChanged(bool) final; 72 void configurationChanged(const WebCore::PlatformAudioTrackConfiguration&) final; 72 73 73 74 // TrackPrivateBaseClient … … 77 78 void willRemove() final; 78 79 79 TrackPrivateRemoteConfiguration configuration();80 AudioTrackPrivateRemoteConfiguration configuration(); 80 81 void configurationChanged(); 81 82 -
branches/safari-613.1.12.1-branch/Source/WebKit/GPUProcess/media/RemoteVideoTrackProxy.cpp
r286908 r287576 34 34 #include "MediaPlayerPrivateRemoteMessages.h" 35 35 #include "RemoteMediaPlayerProxy.h" 36 #include " TrackPrivateRemoteConfiguration.h"36 #include "VideoTrackPrivateRemoteConfiguration.h" 37 37 38 38 namespace WebKit { … … 55 55 } 56 56 57 TrackPrivateRemoteConfiguration RemoteVideoTrackProxy::configuration()57 VideoTrackPrivateRemoteConfiguration RemoteVideoTrackProxy::configuration() 58 58 { 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; 59 return { 60 { 61 m_trackPrivate->id(), 62 m_trackPrivate->label(), 63 m_trackPrivate->language(), 64 m_trackPrivate->startTimeVariance(), 65 m_trackPrivate->trackIndex(), 66 }, 67 m_trackPrivate->selected(), 68 m_trackPrivate->kind(), 69 m_trackPrivate->configuration(), 70 }; 74 71 } 75 72 -
branches/safari-613.1.12.1-branch/Source/WebKit/GPUProcess/media/RemoteVideoTrackProxy.h
r286908 r287576 45 45 46 46 class GPUConnectionToWebProcess; 47 struct TrackPrivateRemoteConfiguration;47 struct VideoTrackPrivateRemoteConfiguration; 48 48 49 49 class RemoteVideoTrackProxy final … … 70 70 // VideoTrackPrivateClient 71 71 void selectedChanged(bool) final; 72 void configurationChanged( ) final { updateConfiguration(); }72 void configurationChanged(const WebCore::PlatformVideoTrackConfiguration&) final { updateConfiguration(); } 73 73 74 74 // TrackPrivateBaseClient … … 78 78 void willRemove() final; 79 79 80 TrackPrivateRemoteConfiguration configuration();80 VideoTrackPrivateRemoteConfiguration configuration(); 81 81 void updateConfiguration(); 82 82 -
branches/safari-613.1.12.1-branch/Source/WebKit/GPUProcess/media/TrackPrivateRemoteConfiguration.h
r286908 r287576 28 28 #if ENABLE(GPU_PROCESS) 29 29 30 #include <WebCore/AudioTrackPrivate.h>31 #include <WebCore/VideoTrackPrivate.h>32 30 #include <wtf/MediaTime.h> 33 31 … … 41 39 int trackIndex; 42 40 43 bool enabled;44 WebCore::AudioTrackPrivate::Kind audioKind { WebCore::AudioTrackPrivate::Kind::None };45 46 bool selected;47 WebCore::VideoTrackPrivate::Kind videoKind { WebCore::VideoTrackPrivate::Kind::None };48 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 58 41 template<class Encoder> 59 42 void encode(Encoder& encoder) const … … 64 47 encoder << startTimeVariance; 65 48 encoder << trackIndex; 66 encoder << enabled;67 encoder << audioKind;68 encoder << selected;69 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;78 49 } 79 50 80 51 template <class Decoder> 81 static std::optional<TrackPrivateRemoteConfiguration> decode(Decoder& decoder)52 static bool decode(Decoder& decoder, TrackPrivateRemoteConfiguration& configuration) 82 53 { 83 std::optional<AtomString> trackId; 84 decoder >> trackId; 85 if (!trackId) 86 return std::nullopt; 87 88 std::optional<AtomString> label; 89 decoder >> label; 90 if (!label) 91 return std::nullopt; 92 93 std::optional<AtomString> language; 94 decoder >> language; 95 if (!language) 96 return std::nullopt; 97 98 std::optional<MediaTime> startTimeVariance; 99 decoder >> startTimeVariance; 100 if (!startTimeVariance) 101 return std::nullopt; 102 103 std::optional<int> trackIndex; 104 decoder >> trackIndex; 105 if (!trackIndex) 106 return std::nullopt; 107 108 std::optional<bool> enabled; 109 decoder >> enabled; 110 if (!enabled) 111 return std::nullopt; 112 113 std::optional<WebCore::AudioTrackPrivate::Kind> audioKind; 114 decoder >> audioKind; 115 if (!audioKind) 116 return std::nullopt; 117 118 std::optional<bool> selected; 119 decoder >> selected; 120 if (!selected) 121 return std::nullopt; 122 123 std::optional<WebCore::VideoTrackPrivate::Kind> videoKind; 124 decoder >> videoKind; 125 if (!videoKind) 126 return std::nullopt; 127 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 168 return {{ 169 WTFMove(*trackId), 170 WTFMove(*label), 171 WTFMove(*language), 172 WTFMove(*startTimeVariance), 173 *trackIndex, 174 *enabled, 175 *audioKind, 176 *selected, 177 *videoKind, 178 WTFMove(*codec), 179 *width, 180 *height, 181 WTFMove(*colorSpace), 182 *framerate, 183 *bitrate, 184 *sampleRate, 185 *numberOfChannels, 186 }}; 54 return decoder.decode(configuration.trackId) 55 && decoder.decode(configuration.label) 56 && decoder.decode(configuration.language) 57 && decoder.decode(configuration.startTimeVariance) 58 && decoder.decode(configuration.trackIndex); 187 59 } 188 60 }; -
branches/safari-613.1.12.1-branch/Source/WebKit/GPUProcess/media/VideoTrackPrivateRemoteConfiguration.h
r287572 r287576 26 26 #pragma once 27 27 28 #i nclude "TrackPrivateBaseClient.h"28 #if ENABLE(GPU_PROCESS) 29 29 30 #if ENABLE(VIDEO) 30 #include "TrackPrivateRemoteConfiguration.h" 31 #include <WebCore/VideoTrackPrivate.h> 31 32 32 namespace Web Core{33 namespace WebKit { 33 34 34 class AudioTrackPrivate; 35 struct VideoTrackPrivateRemoteConfiguration : TrackPrivateRemoteConfiguration { 36 bool selected; 37 WebCore::VideoTrackPrivate::Kind kind { WebCore::VideoTrackPrivate::Kind::None }; 38 WebCore::PlatformVideoTrackConfiguration trackConfiguration; 35 39 36 class AudioTrackPrivateClient : public TrackPrivateBaseClient { 37 public: 38 virtual void enabledChanged(bool) = 0; 40 template<class Encoder> 41 void encode(Encoder& encoder) const 42 { 43 TrackPrivateRemoteConfiguration::encode(encoder); 44 encoder << selected; 45 encoder << kind; 46 encoder << trackConfiguration; 47 } 48 49 template <class Decoder> 50 static bool WARN_UNUSED_RETURN decode(Decoder& decoder, VideoTrackPrivateRemoteConfiguration& configuration) 51 { 52 if (!TrackPrivateRemoteConfiguration::decode(decoder, configuration)) 53 return false; 54 if (!decoder.decode(configuration.selected)) 55 return false; 56 if (!decoder.decode(configuration.kind)) 57 return false; 58 if (!decoder.decode(configuration.trackConfiguration)) 59 return false; 60 return true; 61 } 39 62 }; 40 63 41 } 64 } // namespace WebKit 42 65 43 66 #endif -
branches/safari-613.1.12.1-branch/Source/WebKit/WebKit.xcodeproj/project.pbxproj
r287145 r287576 6237 6237 CDCDC99B248FE8DA00A69522 /* EndowmentStateTracker.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EndowmentStateTracker.h; sourceTree = "<group>"; }; 6238 6238 CDCDC99C248FE8DA00A69522 /* EndowmentStateTracker.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = EndowmentStateTracker.mm; sourceTree = "<group>"; }; 6239 CDD08AC3277EBCE500EA3755 /* AudioTrackPrivateRemoteConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioTrackPrivateRemoteConfiguration.h; sourceTree = "<group>"; }; 6240 CDD08AC4277ED7E000EA3755 /* VideoTrackPrivateRemoteConfiguration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = VideoTrackPrivateRemoteConfiguration.h; sourceTree = "<group>"; }; 6239 6241 CDD5356F240DD34300F7B8C4 /* RemoteAudioSession.messages.in */ = {isa = PBXFileReference; lastKnownFileType = text; path = RemoteAudioSession.messages.in; sourceTree = "<group>"; }; 6240 6242 CDD53571240DDE0600F7B8C4 /* RemoteAudioSessionProxyMessageReceiver.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RemoteAudioSessionProxyMessageReceiver.cpp; sourceTree = "<group>"; }; … … 6736 6738 1D0ECEA923FC84BB00D172F6 /* cocoa */, 6737 6739 CDA959442412C4DA00910EEF /* ios */, 6740 CDD08AC3277EBCE500EA3755 /* AudioTrackPrivateRemoteConfiguration.h */, 6738 6741 1D4FB40B2565C89A001AC2AD /* InitializationSegmentInfo.h */, 6739 6742 9B1229CC23FF25F2008CA751 /* RemoteAudioDestinationManager.cpp */, … … 6811 6814 071BC57B23CA532400680D7C /* TrackPrivateRemoteConfiguration.h */, 6812 6815 071BC57D23CA56D200680D7C /* TrackPrivateRemoteIdentifier.h */, 6816 CDD08AC4277ED7E000EA3755 /* VideoTrackPrivateRemoteConfiguration.h */, 6813 6817 ); 6814 6818 path = media; -
branches/safari-613.1.12.1-branch/Source/WebKit/WebProcess/GPU/media/AudioTrackPrivateRemote.cpp
r286908 r287576 30 30 #if ENABLE(GPU_PROCESS) 31 31 32 #include "AudioTrackPrivateRemoteConfiguration.h" 32 33 #include "GPUProcessConnection.h" 33 34 #include "MediaPlayerPrivateRemote.h" 34 35 #include "RemoteMediaPlayerProxyMessages.h" 35 #include "TrackPrivateRemoteConfiguration.h"36 36 37 37 namespace WebKit { 38 38 39 AudioTrackPrivateRemote::AudioTrackPrivateRemote(GPUProcessConnection& gpuProcessConnection, WebCore::MediaPlayerIdentifier playerIdentifier, TrackPrivateRemoteIdentifier idendifier, TrackPrivateRemoteConfiguration&& configuration)39 AudioTrackPrivateRemote::AudioTrackPrivateRemote(GPUProcessConnection& gpuProcessConnection, WebCore::MediaPlayerIdentifier playerIdentifier, TrackPrivateRemoteIdentifier idendifier, AudioTrackPrivateRemoteConfiguration&& configuration) 40 40 : m_gpuProcessConnection(gpuProcessConnection) 41 41 , m_playerIdentifier(playerIdentifier) … … 56 56 } 57 57 58 void AudioTrackPrivateRemote::updateConfiguration( TrackPrivateRemoteConfiguration&& configuration)58 void AudioTrackPrivateRemote::updateConfiguration(AudioTrackPrivateRemoteConfiguration&& configuration) 59 59 { 60 60 if (configuration.trackId != m_id) { … … 81 81 m_trackIndex = configuration.trackIndex; 82 82 m_startTimeVariance = configuration.startTimeVariance; 83 m_kind = configuration.audioKind; 84 setCodec(WTFMove(configuration.codec)); 85 setSampleRate(configuration.sampleRate); 86 setNumberOfChannels(configuration.numberOfChannels); 87 setBitrate(configuration.bitrate); 83 m_kind = configuration.kind; 84 setConfiguration(WTFMove(configuration.trackConfiguration)); 88 85 89 86 AudioTrackPrivate::setEnabled(configuration.enabled); -
branches/safari-613.1.12.1-branch/Source/WebKit/WebProcess/GPU/media/AudioTrackPrivateRemote.h
r286908 r287576 37 37 class GPUProcessConnection; 38 38 class MediaPlayerPrivateRemote; 39 struct TrackPrivateRemoteConfiguration;39 struct AudioTrackPrivateRemoteConfiguration; 40 40 41 41 class AudioTrackPrivateRemote final : public WebCore::AudioTrackPrivate { 42 42 WTF_MAKE_NONCOPYABLE(AudioTrackPrivateRemote) 43 43 public: 44 static Ref<AudioTrackPrivateRemote> create(GPUProcessConnection& gpuProcessConnection, WebCore::MediaPlayerIdentifier playerIdentifier, TrackPrivateRemoteIdentifier idendifier, TrackPrivateRemoteConfiguration&& configuration)44 static Ref<AudioTrackPrivateRemote> create(GPUProcessConnection& gpuProcessConnection, WebCore::MediaPlayerIdentifier playerIdentifier, TrackPrivateRemoteIdentifier idendifier, AudioTrackPrivateRemoteConfiguration&& configuration) 45 45 { 46 46 return adoptRef(*new AudioTrackPrivateRemote(gpuProcessConnection, playerIdentifier, idendifier, WTFMove(configuration))); … … 48 48 49 49 AtomString id() const final { return m_id; } 50 void updateConfiguration( TrackPrivateRemoteConfiguration&&);50 void updateConfiguration(AudioTrackPrivateRemoteConfiguration&&); 51 51 52 52 private: 53 AudioTrackPrivateRemote(GPUProcessConnection&, WebCore::MediaPlayerIdentifier, TrackPrivateRemoteIdentifier, TrackPrivateRemoteConfiguration&&);53 AudioTrackPrivateRemote(GPUProcessConnection&, WebCore::MediaPlayerIdentifier, TrackPrivateRemoteIdentifier, AudioTrackPrivateRemoteConfiguration&&); 54 54 55 55 using AudioTrackKind = WebCore::AudioTrackPrivate::Kind; -
branches/safari-613.1.12.1-branch/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.cpp
r285993 r287576 575 575 } 576 576 577 void MediaPlayerPrivateRemote::addRemoteAudioTrack(TrackPrivateRemoteIdentifier identifier, TrackPrivateRemoteConfiguration&& configuration)577 void MediaPlayerPrivateRemote::addRemoteAudioTrack(TrackPrivateRemoteIdentifier identifier, AudioTrackPrivateRemoteConfiguration&& configuration) 578 578 { 579 579 auto addResult = m_audioTracks.ensure(identifier, [&] { … … 605 605 } 606 606 607 void MediaPlayerPrivateRemote::remoteAudioTrackConfigurationChanged(TrackPrivateRemoteIdentifier identifier, TrackPrivateRemoteConfiguration&& configuration)607 void MediaPlayerPrivateRemote::remoteAudioTrackConfigurationChanged(TrackPrivateRemoteIdentifier identifier, AudioTrackPrivateRemoteConfiguration&& configuration) 608 608 { 609 609 ASSERT(m_audioTracks.contains(identifier)); … … 733 733 } 734 734 735 void MediaPlayerPrivateRemote::addRemoteVideoTrack(TrackPrivateRemoteIdentifier identifier, TrackPrivateRemoteConfiguration&& configuration)735 void MediaPlayerPrivateRemote::addRemoteVideoTrack(TrackPrivateRemoteIdentifier identifier, VideoTrackPrivateRemoteConfiguration&& configuration) 736 736 { 737 737 auto addResult = m_videoTracks.ensure(identifier, [&] { … … 763 763 } 764 764 765 void MediaPlayerPrivateRemote::remoteVideoTrackConfigurationChanged(TrackPrivateRemoteIdentifier identifier, TrackPrivateRemoteConfiguration&& configuration)765 void MediaPlayerPrivateRemote::remoteVideoTrackConfigurationChanged(TrackPrivateRemoteIdentifier identifier, VideoTrackPrivateRemoteConfiguration&& configuration) 766 766 { 767 767 ASSERT(m_videoTracks.contains(identifier)); -
branches/safari-613.1.12.1-branch/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.h
r285993 r287576 68 68 class RemoteAudioSourceProvider; 69 69 class UserData; 70 struct AudioTrackPrivateRemoteConfiguration; 70 71 struct TextTrackPrivateRemoteConfiguration; 71 struct TrackPrivateRemoteConfiguration;72 struct VideoTrackPrivateRemoteConfiguration; 72 73 73 74 class MediaPlayerPrivateRemote final … … 118 119 void currentTimeChanged(const MediaTime&, const MonotonicTime&, bool); 119 120 120 void addRemoteAudioTrack(TrackPrivateRemoteIdentifier, TrackPrivateRemoteConfiguration&&);121 void addRemoteAudioTrack(TrackPrivateRemoteIdentifier, AudioTrackPrivateRemoteConfiguration&&); 121 122 void removeRemoteAudioTrack(TrackPrivateRemoteIdentifier); 122 void remoteAudioTrackConfigurationChanged(TrackPrivateRemoteIdentifier, TrackPrivateRemoteConfiguration&&);123 124 void addRemoteVideoTrack(TrackPrivateRemoteIdentifier, TrackPrivateRemoteConfiguration&&);123 void remoteAudioTrackConfigurationChanged(TrackPrivateRemoteIdentifier, AudioTrackPrivateRemoteConfiguration&&); 124 125 void addRemoteVideoTrack(TrackPrivateRemoteIdentifier, VideoTrackPrivateRemoteConfiguration&&); 125 126 void removeRemoteVideoTrack(TrackPrivateRemoteIdentifier); 126 void remoteVideoTrackConfigurationChanged(TrackPrivateRemoteIdentifier, TrackPrivateRemoteConfiguration&&);127 void remoteVideoTrackConfigurationChanged(TrackPrivateRemoteIdentifier, VideoTrackPrivateRemoteConfiguration&&); 127 128 128 129 void addRemoteTextTrack(TrackPrivateRemoteIdentifier, TextTrackPrivateRemoteConfiguration&&); -
branches/safari-613.1.12.1-branch/Source/WebKit/WebProcess/GPU/media/MediaPlayerPrivateRemote.messages.in
r285993 r287576 42 42 CurrentTimeChanged(MediaTime mediaTime, MonotonicTime wallTime, bool timeIsProgressing) 43 43 44 AddRemoteAudioTrack(WebKit::TrackPrivateRemoteIdentifier trackID, struct WebKit:: TrackPrivateRemoteConfiguration configuration)44 AddRemoteAudioTrack(WebKit::TrackPrivateRemoteIdentifier trackID, struct WebKit::AudioTrackPrivateRemoteConfiguration configuration) 45 45 RemoveRemoteAudioTrack(WebKit::TrackPrivateRemoteIdentifier trackID) 46 RemoteAudioTrackConfigurationChanged(WebKit::TrackPrivateRemoteIdentifier trackID, struct WebKit:: TrackPrivateRemoteConfiguration configuration)46 RemoteAudioTrackConfigurationChanged(WebKit::TrackPrivateRemoteIdentifier trackID, struct WebKit::AudioTrackPrivateRemoteConfiguration configuration) 47 47 48 AddRemoteVideoTrack(WebKit::TrackPrivateRemoteIdentifier trackID, struct WebKit:: TrackPrivateRemoteConfiguration configuration)48 AddRemoteVideoTrack(WebKit::TrackPrivateRemoteIdentifier trackID, struct WebKit::VideoTrackPrivateRemoteConfiguration configuration) 49 49 RemoveRemoteVideoTrack(WebKit::TrackPrivateRemoteIdentifier trackID) 50 RemoteVideoTrackConfigurationChanged(WebKit::TrackPrivateRemoteIdentifier trackID, struct WebKit:: TrackPrivateRemoteConfiguration configuration)50 RemoteVideoTrackConfigurationChanged(WebKit::TrackPrivateRemoteIdentifier trackID, struct WebKit::VideoTrackPrivateRemoteConfiguration configuration) 51 51 52 52 AddRemoteTextTrack(WebKit::TrackPrivateRemoteIdentifier trackID, struct WebKit::TextTrackPrivateRemoteConfiguration configuration) -
branches/safari-613.1.12.1-branch/Source/WebKit/WebProcess/GPU/media/VideoTrackPrivateRemote.cpp
r286908 r287576 33 33 #include "MediaPlayerPrivateRemote.h" 34 34 #include "RemoteMediaPlayerProxyMessages.h" 35 #include "VideoTrackPrivateRemoteConfiguration.h" 35 36 36 37 namespace WebKit { 37 38 38 VideoTrackPrivateRemote::VideoTrackPrivateRemote(GPUProcessConnection& gpuProcessConnection, WebCore::MediaPlayerIdentifier playerIdentifier, TrackPrivateRemoteIdentifier idendifier, TrackPrivateRemoteConfiguration&& configuration)39 VideoTrackPrivateRemote::VideoTrackPrivateRemote(GPUProcessConnection& gpuProcessConnection, WebCore::MediaPlayerIdentifier playerIdentifier, TrackPrivateRemoteIdentifier idendifier, VideoTrackPrivateRemoteConfiguration&& configuration) 39 40 : m_gpuProcessConnection(gpuProcessConnection) 40 41 , m_playerIdentifier(playerIdentifier) … … 55 56 } 56 57 57 void VideoTrackPrivateRemote::updateConfiguration( TrackPrivateRemoteConfiguration&& configuration)58 void VideoTrackPrivateRemote::updateConfiguration(VideoTrackPrivateRemoteConfiguration&& configuration) 58 59 { 59 60 if (configuration.trackId != m_id) { … … 80 81 m_trackIndex = configuration.trackIndex; 81 82 m_startTimeVariance = configuration.startTimeVariance; 82 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 83 m_kind = configuration.kind; 84 setConfiguration(WTFMove(configuration.trackConfiguration)); 90 85 VideoTrackPrivate::setSelected(configuration.selected); 91 86 } -
branches/safari-613.1.12.1-branch/Source/WebKit/WebProcess/GPU/media/VideoTrackPrivateRemote.h
r286908 r287576 29 29 #if ENABLE(GPU_PROCESS) 30 30 31 #include "TrackPrivateRemoteConfiguration.h"32 31 #include "TrackPrivateRemoteIdentifier.h" 33 32 #include <WebCore/MediaPlayerIdentifier.h> … … 38 37 class GPUProcessConnection; 39 38 class MediaPlayerPrivateRemote; 40 struct TrackPrivateRemoteConfiguration;39 struct VideoTrackPrivateRemoteConfiguration; 41 40 42 41 class VideoTrackPrivateRemote … … 44 43 WTF_MAKE_NONCOPYABLE(VideoTrackPrivateRemote) 45 44 public: 46 static Ref<VideoTrackPrivateRemote> create(GPUProcessConnection& gpuProcessConnection, WebCore::MediaPlayerIdentifier playerIdentifier, TrackPrivateRemoteIdentifier idendifier, TrackPrivateRemoteConfiguration&& configuration)45 static Ref<VideoTrackPrivateRemote> create(GPUProcessConnection& gpuProcessConnection, WebCore::MediaPlayerIdentifier playerIdentifier, TrackPrivateRemoteIdentifier idendifier, VideoTrackPrivateRemoteConfiguration&& configuration) 47 46 { 48 47 return adoptRef(*new VideoTrackPrivateRemote(gpuProcessConnection, playerIdentifier, idendifier, WTFMove(configuration))); 49 48 } 50 49 51 void updateConfiguration( TrackPrivateRemoteConfiguration&&);50 void updateConfiguration(VideoTrackPrivateRemoteConfiguration&&); 52 51 53 52 using VideoTrackKind = WebCore::VideoTrackPrivate::Kind; … … 58 57 int trackIndex() const final { return m_trackIndex; } 59 58 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; }66 59 67 60 private: 68 VideoTrackPrivateRemote(GPUProcessConnection&, WebCore::MediaPlayerIdentifier, TrackPrivateRemoteIdentifier, TrackPrivateRemoteConfiguration&&);61 VideoTrackPrivateRemote(GPUProcessConnection&, WebCore::MediaPlayerIdentifier, TrackPrivateRemoteIdentifier, VideoTrackPrivateRemoteConfiguration&&); 69 62 70 63 void setSelected(bool) final; … … 77 70 AtomString m_language; 78 71 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 };85 72 MediaTime m_startTimeVariance { MediaTime::zeroTime() }; 86 73 TrackPrivateRemoteIdentifier m_idendifier;
Note:
See TracChangeset
for help on using the changeset viewer.