Changeset 285984 in webkit
- Timestamp:
- Nov 17, 2021 11:46:05 PM (8 months ago)
- Location:
- trunk
- Files:
-
- 1 added
- 49 edited
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/video-rvfc/request-video-frame-callback-webrtc.https-expected.txt (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Headers.cmake (modified) (1 diff)
-
Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp (modified) (1 diff)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (4 diffs)
-
Source/WebCore/html/HTMLVideoElement.cpp (modified) (3 diffs)
-
Source/WebCore/html/VideoFrameMetadata.idl (modified) (1 diff)
-
Source/WebCore/platform/VideoSampleMetadata.h (added)
-
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h (modified) (3 diffs)
-
Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (modified) (6 diffs)
-
Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.h (modified) (1 diff)
-
Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (modified) (2 diffs)
-
Source/WebCore/platform/mediastream/RealtimeMediaSource.h (modified) (3 diffs)
-
Source/WebCore/platform/mediastream/RealtimeOutgoingVideoSource.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.cpp (modified) (2 diffs)
-
Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp (modified) (3 diffs)
-
Source/WebCore/platform/mediastream/RealtimeVideoSource.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/cocoa/DisplayCaptureSourceCocoa.cpp (modified) (2 diffs)
-
Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.cpp (modified) (2 diffs)
-
Source/WebCore/platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeOutgoingVideoSourceLibWebRTC.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeOutgoingVideoSourceLibWebRTC.h (modified) (1 diff)
-
Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm (modified) (1 diff)
-
Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm (modified) (1 diff)
-
Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm (modified) (1 diff)
-
Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp (modified) (1 diff)
-
Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.h (modified) (1 diff)
-
Source/WebCore/testing/Internals.cpp (modified) (1 diff)
-
Source/WebCore/testing/Internals.h (modified) (1 diff)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (modified) (2 diffs)
-
Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp (modified) (1 diff)
-
Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h (modified) (1 diff)
-
Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp (modified) (4 diffs)
-
Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h (modified) (2 diffs)
-
Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.messages.in (modified) (1 diff)
-
Source/WebKit/WebProcess/cocoa/RemoteRealtimeDisplaySource.h (modified) (1 diff)
-
Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.cpp (modified) (2 diffs)
-
Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r285982 r285984 1 2021-11-17 Youenn Fablet <youenn@apple.com> 2 3 Add support for more rvfc metadata 4 https://bugs.webkit.org/show_bug.cgi?id=233185 5 6 Reviewed by Eric Carlson. 7 8 * platform/ios-wk2/TestExpectations: 9 * platform/mac-wk1/TestExpectations: 10 * platform/mac-wk2/TestExpectations: 11 1 12 2021-11-17 Ricky Mondello <rmondello@apple.com> 2 13 -
trunk/LayoutTests/imported/w3c/ChangeLog
r285954 r285984 1 2021-11-17 Youenn Fablet <youenn@apple.com> 2 3 Add support for more rvfc metadata 4 https://bugs.webkit.org/show_bug.cgi?id=233185 5 6 Reviewed by Eric Carlson. 7 8 * web-platform-tests/video-rvfc/request-video-frame-callback-webrtc.https-expected.txt: 9 1 10 2021-11-17 Chris Dumez <cdumez@apple.com> 2 11 -
trunk/LayoutTests/imported/w3c/web-platform-tests/video-rvfc/request-video-frame-callback-webrtc.https-expected.txt
r284528 r285984 1 1 2 FAIL Test video.requestVideoFrameCallback() parameters for WebRTC applications. assert_greater_than: expected a number but got a "undefined" 2 PASS Test video.requestVideoFrameCallback() parameters for WebRTC applications. 3 3 4 4 -
trunk/Source/WebCore/ChangeLog
r285982 r285984 1 2021-11-17 Youenn Fablet <youenn@apple.com> 2 3 Add support for more rvfc metadata 4 https://bugs.webkit.org/show_bug.cgi?id=233185 5 6 Reviewed by Eric Carlson. 7 8 Introduce VideoSampleMetadata that allows a RealtimeMediaSource to provide metadata for each video frame. 9 Fill VideoSampleMetadata for each source (capture and WebRTC) 10 Make use of VideoSampleMetadata in MediaPlayerPrivateMediaStreamAVFObjC to fill VideoFrameMetadata. 11 Enhance MediaPlayerPrivateAVFoundationObjC to fill in the newly exposed metadata in VideoFrameMetadata. 12 Update HTMLVideoElement to process the timestamp values as needed. 13 14 Covered by existing tests. 15 16 * Headers.cmake: 17 * Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp: 18 * WebCore.xcodeproj/project.pbxproj: 19 * html/HTMLVideoElement.cpp: 20 * html/VideoFrameMetadata.idl: 21 * platform/VideoSampleMetadata.h: Added. 22 * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h: 23 * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm: 24 * platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp: 25 * platform/mediarecorder/MediaRecorderPrivateAVFImpl.h: 26 * platform/mediarecorder/MediaRecorderPrivateMock.cpp: 27 * platform/mediarecorder/MediaRecorderPrivateMock.h: 28 * platform/mediastream/RealtimeIncomingVideoSource.cpp: 29 * platform/mediastream/RealtimeIncomingVideoSource.h: 30 * platform/mediastream/RealtimeMediaSource.cpp: 31 * platform/mediastream/RealtimeMediaSource.h: 32 * platform/mediastream/RealtimeOutgoingVideoSource.h: 33 * platform/mediastream/RealtimeVideoCaptureSource.cpp: 34 * platform/mediastream/RealtimeVideoCaptureSource.h: 35 * platform/mediastream/RealtimeVideoSource.cpp: 36 * platform/mediastream/RealtimeVideoSource.h: 37 * platform/mediastream/cocoa/DisplayCaptureSourceCocoa.cpp: 38 * platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp: 39 * platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp: 40 * platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.cpp: 41 * platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.h: 42 * platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp: 43 * platform/mediastream/libwebrtc/gstreamer/RealtimeOutgoingVideoSourceLibWebRTC.cpp: 44 * platform/mediastream/libwebrtc/gstreamer/RealtimeOutgoingVideoSourceLibWebRTC.h: 45 * platform/mediastream/mac/AVVideoCaptureSource.mm: 46 * platform/mediastream/mac/MockRealtimeVideoSourceMac.mm: 47 * platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm: 48 * platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp: 49 * platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.h: 50 * testing/Internals.cpp: 51 * testing/Internals.h: 52 1 53 2021-11-17 Ricky Mondello <rmondello@apple.com> 2 54 -
trunk/Source/WebCore/Headers.cmake
r285949 r285984 1191 1191 platform/ValidationBubble.h 1192 1192 platform/VideoFrameMetadata.h 1193 platform/VideoSampleMetadata.h 1193 1194 platform/WebGLStateTracker.h 1194 1195 platform/Widget.h -
trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp
r283489 r285984 197 197 return; 198 198 199 videoSampleAvailable(*sample); 199 VideoSampleMetadata metadata; 200 metadata.captureTime = MonotonicTime::now().secondsSinceEpoch(); 201 videoSampleAvailable(*sample, metadata); 200 202 } 201 203 -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r285949 r285984 1119 1119 415864A023BF7CBF00A0A61E /* RealtimeVideoUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = 41D1938F2152C561006F14CA /* RealtimeVideoUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1120 1120 415CDAF51E6B8F8B004F11EE /* CanvasCaptureMediaStreamTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C7E1061E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.h */; }; 1121 416049332743B0E800A86FA0 /* VideoSampleMetadata.h in Headers */ = {isa = PBXBuildFile; fileRef = 416049312743B0E700A86FA0 /* VideoSampleMetadata.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1121 1122 41614A791DA64241004AD06F /* HTTPHeaderValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 41614A771DA64236004AD06F /* HTTPHeaderValues.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1122 1123 4161E2D51FE48DC500EC2E96 /* FetchLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 4147E2B51C89912600A7E715 /* FetchLoader.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 8341 8342 415E1BB62150152A0022DA96 /* RTCRtpSynchronizationSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCRtpSynchronizationSource.h; sourceTree = "<group>"; }; 8342 8343 415E1BB7215015300022DA96 /* RTCRtpSynchronizationSource.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RTCRtpSynchronizationSource.idl; sourceTree = "<group>"; }; 8344 416049312743B0E700A86FA0 /* VideoSampleMetadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VideoSampleMetadata.h; sourceTree = "<group>"; }; 8343 8345 41614A761DA64236004AD06F /* HTTPHeaderValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPHeaderValues.cpp; sourceTree = "<group>"; }; 8344 8346 41614A771DA64236004AD06F /* HTTPHeaderValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPHeaderValues.h; sourceTree = "<group>"; }; … … 29159 29161 83C45B8D1DC2B67C008871BA /* ValidationBubble.h */, 29160 29162 41DEEFB42719BA1900CB8D74 /* VideoFrameMetadata.h */, 29163 416049312743B0E700A86FA0 /* VideoSampleMetadata.h */, 29161 29164 515F79511CFCA3C700CCED93 /* WebCoreCrossThreadCopier.cpp */, 29162 29165 515F79521CFCA3C700CCED93 /* WebCoreCrossThreadCopier.h */, … … 36734 36737 075033A8252BD36800F70CE3 /* VideoPlaybackQualityMetrics.h in Headers */, 36735 36738 0757B13E214AE79900794B0D /* VideoPreset.h in Headers */, 36739 416049332743B0E800A86FA0 /* VideoSampleMetadata.h in Headers */, 36736 36740 CDC939A81E9BDFB100BB768D /* VideoToolboxSoftLink.h in Headers */, 36737 36741 BE88E0DF1715D2A200658D98 /* VideoTrack.h in Headers */, -
trunk/Source/WebCore/html/HTMLVideoElement.cpp
r284528 r285984 42 42 #include "Logging.h" 43 43 #include "Page.h" 44 #include "Performance.h" 44 45 #include "PictureInPictureSupport.h" 45 46 #include "RenderImage.h" … … 610 611 } 611 612 613 static void processVideoFrameMetadataTimestamps(VideoFrameMetadata& metadata, Performance& performance) 614 { 615 metadata.presentationTime = performance.relativeTimeFromTimeOriginInReducedResolution(MonotonicTime::fromRawSeconds(metadata.presentationTime)); 616 metadata.expectedDisplayTime = performance.relativeTimeFromTimeOriginInReducedResolution(MonotonicTime::fromRawSeconds(metadata.expectedDisplayTime)); 617 if (metadata.captureTime) 618 metadata.captureTime = performance.relativeTimeFromTimeOriginInReducedResolution(MonotonicTime::fromRawSeconds(*metadata.captureTime)); 619 if (metadata.receiveTime) 620 metadata.receiveTime = performance.relativeTimeFromTimeOriginInReducedResolution(MonotonicTime::fromRawSeconds(*metadata.receiveTime)); 621 } 622 612 623 void HTMLVideoElement::serviceRequestVideoFrameCallbacks(ReducedResolutionSeconds now) 613 624 { … … 616 627 617 628 auto videoFrameMetadata = player()->videoFrameMetadata(); 618 if (!videoFrameMetadata) 619 return; 629 if (!videoFrameMetadata || !document().domWindow()) 630 return; 631 632 processVideoFrameMetadataTimestamps(*videoFrameMetadata, document().domWindow()->performance()); 620 633 621 634 Ref protectedThis { *this }; -
trunk/Source/WebCore/html/VideoFrameMetadata.idl
r284528 r285984 30 30 JSGenerateToJSObject, 31 31 ] dictionary VideoFrameMetadata { 32 // FIXME: expose presentationTime and expectedDisplayTime. 33 // required DOMHighResTimeStamp presentationTime; 34 // required DOMHighResTimeStamp expectedDisplayTime; 32 required DOMHighResTimeStamp presentationTime; 33 required DOMHighResTimeStamp expectedDisplayTime; 35 34 36 35 required unsigned long width; -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.h
r284857 r285984 137 137 void flushRenderers(); 138 138 139 void processNewVideoSample(MediaSample&, bool hasChangedOrientation );139 void processNewVideoSample(MediaSample&, bool hasChangedOrientation, VideoSampleMetadata, Seconds); 140 140 void enqueueVideoSample(MediaSample&); 141 141 void requestNotificationWhenReadyForVideoData(); … … 209 209 210 210 // RealtimeMediaSouce::VideoSampleObserver 211 void videoSampleAvailable(MediaSample& ) final;211 void videoSampleAvailable(MediaSample&, VideoSampleMetadata) final; 212 212 213 213 RetainPtr<PlatformLayer> createVideoFullscreenLayer() override; … … 284 284 uint64_t m_sampleCount { 0 }; 285 285 uint64_t m_lastVideoFrameMetadataSampleCount { 0 }; 286 Seconds m_presentationTime { 0 }; 287 VideoSampleMetadata m_sampleMetadata; 286 288 }; 287 289 -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm
r284528 r285984 245 245 } 246 246 247 void MediaPlayerPrivateMediaStreamAVFObjC::videoSampleAvailable(MediaSample& sample) 248 { 249 processNewVideoSample(sample, sample.videoRotation() != m_videoRotation || sample.videoMirrored() != m_videoMirrored); 247 void MediaPlayerPrivateMediaStreamAVFObjC::videoSampleAvailable(MediaSample& sample, VideoSampleMetadata metadata) 248 { 249 auto presentationTime = MonotonicTime::now().secondsSinceEpoch(); 250 processNewVideoSample(sample, sample.videoRotation() != m_videoRotation || sample.videoMirrored() != m_videoMirrored, metadata, presentationTime); 250 251 enqueueVideoSample(sample); 251 252 } … … 277 278 } 278 279 279 void MediaPlayerPrivateMediaStreamAVFObjC::processNewVideoSample(MediaSample& sample, bool hasChangedOrientation )280 void MediaPlayerPrivateMediaStreamAVFObjC::processNewVideoSample(MediaSample& sample, bool hasChangedOrientation, VideoSampleMetadata metadata, Seconds presentationTime) 280 281 { 281 282 if (!isMainThread()) { … … 284 285 m_currentVideoSample = &sample; 285 286 } 286 callOnMainThread([weakThis = WeakPtr { *this }, hasChangedOrientation ]() mutable {287 callOnMainThread([weakThis = WeakPtr { *this }, hasChangedOrientation, metadata, presentationTime]() mutable { 287 288 if (!weakThis) 288 289 return; … … 299 300 return; 300 301 301 weakThis->processNewVideoSample(*sample, hasChangedOrientation );302 weakThis->processNewVideoSample(*sample, hasChangedOrientation, metadata, presentationTime); 302 303 }); 303 304 return; … … 317 318 } 318 319 320 m_presentationTime = presentationTime; 321 m_sampleMetadata = metadata; 319 322 ++m_sampleCount; 320 323 … … 1107 1110 metadata.height = m_intrinsicSize.height(); 1108 1111 metadata.presentedFrames = m_sampleCount; 1109 1110 // FIXME: It would be good to expose more video frame metadata. 1112 metadata.presentationTime = m_presentationTime.seconds(); 1113 metadata.expectedDisplayTime = m_presentationTime.seconds(); 1114 metadata.processingDuration = m_sampleMetadata.processingDuration; 1115 if (m_sampleMetadata.captureTime) 1116 metadata.captureTime = m_sampleMetadata.captureTime->seconds(); 1117 if (m_sampleMetadata.receiveTime) 1118 metadata.receiveTime = m_sampleMetadata.receiveTime->seconds(); 1119 metadata.rtpTimestamp = m_sampleMetadata.rtpTimestamp; 1111 1120 1112 1121 return metadata; -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp
r284857 r285984 84 84 } 85 85 86 void MediaRecorderPrivateAVFImpl::videoSampleAvailable(MediaSample& sampleBuffer )86 void MediaRecorderPrivateAVFImpl::videoSampleAvailable(MediaSample& sampleBuffer, VideoSampleMetadata) 87 87 { 88 88 if (shouldMuteVideo()) { -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.h
r284857 r285984 50 50 51 51 // MediaRecorderPrivate 52 void videoSampleAvailable(MediaSample& ) final;52 void videoSampleAvailable(MediaSample&, VideoSampleMetadata) final; 53 53 void fetchData(FetchDataCallback&&) final; 54 54 void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.cpp
r284857 r285984 68 68 } 69 69 70 void MediaRecorderPrivateMock::videoSampleAvailable(MediaSample& )70 void MediaRecorderPrivateMock::videoSampleAvailable(MediaSample&, VideoSampleMetadata) 71 71 { 72 72 Locker locker { m_bufferLock }; -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.h
r284857 r285984 43 43 private: 44 44 // MediaRecorderPrivate 45 void videoSampleAvailable(MediaSample& ) final;45 void videoSampleAvailable(MediaSample&, VideoSampleMetadata) final; 46 46 void fetchData(FetchDataCallback&&) final; 47 47 void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; -
trunk/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.cpp
r282755 r285984 105 105 } 106 106 107 VideoSampleMetadata RealtimeIncomingVideoSource::metadataFromVideoFrame(const webrtc::VideoFrame& frame) 108 { 109 VideoSampleMetadata metadata; 110 if (frame.ntp_time_ms() > 0) 111 metadata.captureTime = Seconds::fromMilliseconds(frame.ntp_time_ms()); 112 if (isInBounds<uint32_t>(frame.timestamp())) 113 metadata.rtpTimestamp = frame.timestamp(); 114 auto lastPacketTimestamp = std::max_element(frame.packet_infos().cbegin(), frame.packet_infos().cend(), [](const auto& a, const auto& b) { 115 return a.receive_time() < b.receive_time(); 116 }); 117 metadata.receiveTime = Seconds::fromMicroseconds(lastPacketTimestamp->receive_time().us()); 118 return metadata; 119 } 120 107 121 } // namespace WebCore 108 122 -
trunk/Source/WebCore/platform/mediastream/RealtimeIncomingVideoSource.h
r278253 r285984 63 63 const char* logClassName() const final { return "RealtimeIncomingVideoSource"; } 64 64 #endif 65 65 66 static VideoSampleMetadata metadataFromVideoFrame(const webrtc::VideoFrame&); 67 66 68 private: 67 69 // RealtimeMediaSource API -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp
r283033 r285984 192 192 } 193 193 194 void RealtimeMediaSource::videoSampleAvailable(MediaSample& mediaSample )194 void RealtimeMediaSource::videoSampleAvailable(MediaSample& mediaSample, VideoSampleMetadata metadata) 195 195 { 196 196 #if !RELEASE_LOG_DISABLED … … 212 212 Locker locker { m_videoSampleObserversLock }; 213 213 for (auto* observer : m_videoSampleObservers) 214 observer->videoSampleAvailable(mediaSample );214 observer->videoSampleAvailable(mediaSample, metadata); 215 215 } 216 216 -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h
r284857 r285984 43 43 #include "RealtimeMediaSourceCapabilities.h" 44 44 #include "RealtimeMediaSourceFactory.h" 45 #include "VideoSampleMetadata.h" 45 46 #include <wtf/CompletionHandler.h> 46 47 #include <wtf/Lock.h> … … 103 104 104 105 // May be called on a background thread. 105 virtual void videoSampleAvailable(MediaSample& ) = 0;106 virtual void videoSampleAvailable(MediaSample&, VideoSampleMetadata) = 0; 106 107 }; 107 108 … … 245 246 void initializeEchoCancellation(bool echoCancellation) { m_echoCancellation = echoCancellation; } 246 247 247 void videoSampleAvailable(MediaSample& );248 void videoSampleAvailable(MediaSample&, VideoSampleMetadata); 248 249 void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t); 249 250 -
trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingVideoSource.h
r278340 r285984 136 136 137 137 // RealtimeMediaSource::VideoSampleObserver API 138 void videoSampleAvailable(MediaSample& ) override { }138 void videoSampleAvailable(MediaSample&, VideoSampleMetadata) override { } 139 139 140 140 Ref<MediaStreamTrackPrivate> m_videoSource; -
trunk/Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.cpp
r279940 r285984 387 387 } 388 388 389 void RealtimeVideoCaptureSource::dispatchMediaSampleToObservers(MediaSample& sample )389 void RealtimeVideoCaptureSource::dispatchMediaSampleToObservers(MediaSample& sample, WebCore::VideoSampleMetadata metadata) 390 390 { 391 391 MediaTime sampleTime = sample.presentationTime(); … … 401 401 m_observedFrameRate = (m_observedFrameTimeStamps.size() / interval); 402 402 403 videoSampleAvailable(sample );403 videoSampleAvailable(sample, metadata); 404 404 } 405 405 -
trunk/Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.h
r281305 r285984 73 73 void updateCapabilities(RealtimeMediaSourceCapabilities&); 74 74 75 void dispatchMediaSampleToObservers(MediaSample& );75 void dispatchMediaSampleToObservers(MediaSample&, WebCore::VideoSampleMetadata); 76 76 const Vector<IntSize>& standardVideoSizes(); 77 77 -
trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.cpp
r282755 r285984 180 180 #endif 181 181 182 void RealtimeVideoSource::videoSampleAvailable(MediaSample& sample )182 void RealtimeVideoSource::videoSampleAvailable(MediaSample& sample, VideoSampleMetadata metadata) 183 183 { 184 184 if (m_frameDecimation > 1 && ++m_frameDecimationCounter % m_frameDecimation) … … 194 194 if (!size.isEmpty() && size != expandedIntSize(sample.presentationSize())) { 195 195 if (auto mediaSample = adaptVideoSample(sample)) { 196 RealtimeMediaSource::videoSampleAvailable(*mediaSample );196 RealtimeMediaSource::videoSampleAvailable(*mediaSample, metadata); 197 197 return; 198 198 } … … 200 200 #endif 201 201 202 RealtimeMediaSource::videoSampleAvailable(sample );202 RealtimeMediaSource::videoSampleAvailable(sample, metadata); 203 203 } 204 204 -
trunk/Source/WebCore/platform/mediastream/RealtimeVideoSource.h
r278253 r285984 73 73 74 74 // RealtimeMediaSource::VideoSampleObserver 75 void videoSampleAvailable(MediaSample& ) final;75 void videoSampleAvailable(MediaSample&, VideoSampleMetadata) final; 76 76 77 77 #if PLATFORM(COCOA) -
trunk/Source/WebCore/platform/mediastream/cocoa/DisplayCaptureSourceCocoa.cpp
r284512 r285984 221 221 m_imageTransferSession = ImageTransferSessionVT::create(preferedPixelBufferFormat()); 222 222 223 auto sampleTime = MediaTime::createWithDouble((elapsedTime() + 100_ms).seconds()); 223 auto elapsedTime = this->elapsedTime(); 224 auto sampleTime = MediaTime::createWithDouble((elapsedTime + 100_ms).seconds()); 224 225 225 226 auto frame = m_capturer->generateFrame(); … … 283 284 } 284 285 285 videoSampleAvailable(*sample.get()); 286 VideoSampleMetadata metadata; 287 metadata.captureTime = MonotonicTime::now().secondsSinceEpoch(); 288 videoSampleAvailable(*sample.get(), metadata); 286 289 } 287 290 -
trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp
r284368 r285984 263 263 } 264 264 265 void videoSampleAvailable(MediaSample& sample ) final265 void videoSampleAvailable(MediaSample& sample, VideoSampleMetadata) final 266 266 { 267 267 if (!m_parent) -
trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerVideoCaptureSource.cpp
r281305 r285984 196 196 return; 197 197 198 dispatchMediaSampleToObservers(WTFMove(sample) );198 dispatchMediaSampleToObservers(WTFMove(sample), { }); 199 199 } 200 200 -
trunk/Source/WebCore/platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.cpp
r285071 r285984 89 89 } 90 90 91 void MockDisplayCaptureSourceGStreamer::videoSampleAvailable(MediaSample& sample )91 void MockDisplayCaptureSourceGStreamer::videoSampleAvailable(MediaSample& sample, VideoSampleMetadata metadata) 92 92 { 93 RealtimeMediaSource::videoSampleAvailable(sample );93 RealtimeMediaSource::videoSampleAvailable(sample, metadata); 94 94 } 95 95 … … 155 155 auto sample = MediaSampleGStreamer::createImageSample(WTFMove(*pixelBuffer), size(), frameRate(), sampleRotation()); 156 156 sample->offsetTimestampsBy(MediaTime::createWithDouble((elapsedTime() + 100_ms).seconds())); 157 dispatchMediaSampleToObservers(sample.get() );157 dispatchMediaSampleToObservers(sample.get(), { }); 158 158 } 159 159 -
trunk/Source/WebCore/platform/mediastream/gstreamer/MockRealtimeVideoSourceGStreamer.h
r281491 r285984 49 49 protected: 50 50 // RealtimeMediaSource::VideoSampleObserver 51 void videoSampleAvailable(MediaSample& ) final;51 void videoSampleAvailable(MediaSample&, VideoSampleMetadata) final; 52 52 53 53 private: -
trunk/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeIncomingVideoSourceLibWebRTC.cpp
r282860 r285984 62 62 auto gstSample = GStreamerSampleFromLibWebRTCVideoFrame(frame); 63 63 auto sample = MediaSampleGStreamer::create(WTFMove(gstSample), { }, { }); 64 protectedThis->videoSampleAvailable(sample.get() );64 protectedThis->videoSampleAvailable(sample.get(), { }); 65 65 }); 66 66 } -
trunk/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeOutgoingVideoSourceLibWebRTC.cpp
r279982 r285984 51 51 } 52 52 53 void RealtimeOutgoingVideoSourceLibWebRTC::videoSampleAvailable(MediaSample& sample )53 void RealtimeOutgoingVideoSourceLibWebRTC::videoSampleAvailable(MediaSample& sample, VideoSampleMetadata) 54 54 { 55 55 switch (sample.videoRotation()) { -
trunk/Source/WebCore/platform/mediastream/libwebrtc/gstreamer/RealtimeOutgoingVideoSourceLibWebRTC.h
r279982 r285984 43 43 44 44 // RealtimeMediaSource::VideoSampleObserver API 45 void videoSampleAvailable(MediaSample& ) final;45 void videoSampleAvailable(MediaSample&, VideoSampleMetadata) final; 46 46 }; 47 47 -
trunk/Source/WebCore/platform/mediastream/mac/AVVideoCaptureSource.mm
r285068 r285984 571 571 m_buffer = &sample.get(); 572 572 setIntrinsicSize(expandedIntSize(sample->presentationSize())); 573 dispatchMediaSampleToObservers(WTFMove(sample)); 573 VideoSampleMetadata metadata; 574 metadata.captureTime = MonotonicTime::now().secondsSinceEpoch(); 575 dispatchMediaSampleToObservers(WTFMove(sample), metadata); 574 576 } 575 577 -
trunk/Source/WebCore/platform/mediastream/mac/MockRealtimeVideoSourceMac.mm
r284135 r285984 100 100 return; 101 101 102 m_workQueue->dispatch([this, protectedThis = Ref { *this }, sampleBuffer = WTFMove(sampleBuffer)]() mutable { 103 dispatchMediaSampleToObservers(*sampleBuffer); 102 auto captureTime = MonotonicTime::now().secondsSinceEpoch(); 103 m_workQueue->dispatch([this, protectedThis = Ref { *this }, sampleBuffer = WTFMove(sampleBuffer), captureTime]() mutable { 104 VideoSampleMetadata metadata; 105 metadata.captureTime = captureTime; 106 dispatchMediaSampleToObservers(*sampleBuffer, metadata); 104 107 }); 105 108 } -
trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingVideoSourceCocoa.mm
r283036 r285984 197 197 198 198 setIntrinsicSize(IntSize(width, height)); 199 videoSampleAvailable(MediaSampleAVFObjC::create(sample.get(), rotation)); 199 200 videoSampleAvailable(MediaSampleAVFObjC::create(sample.get(), rotation), metadataFromVideoFrame(frame)); 200 201 } 201 202 -
trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.cpp
r279335 r285984 62 62 } 63 63 64 void RealtimeOutgoingVideoSourceCocoa::videoSampleAvailable(MediaSample& sample )64 void RealtimeOutgoingVideoSourceCocoa::videoSampleAvailable(MediaSample& sample, VideoSampleMetadata) 65 65 { 66 66 #if !RELEASE_LOG_DISABLED -
trunk/Source/WebCore/platform/mediastream/mac/RealtimeOutgoingVideoSourceCocoa.h
r261553 r285984 46 46 47 47 // RealtimeMediaSource::VideoSampleObserver API 48 void videoSampleAvailable(MediaSample& ) final;48 void videoSampleAvailable(MediaSample&, VideoSampleMetadata) final; 49 49 50 50 RetainPtr<CVPixelBufferRef> convertToYUV(CVPixelBufferRef); -
trunk/Source/WebCore/testing/Internals.cpp
r285973 r285984 5478 5478 } 5479 5479 5480 void Internals::videoSampleAvailable(MediaSample& sample )5480 void Internals::videoSampleAvailable(MediaSample& sample, VideoSampleMetadata) 5481 5481 { 5482 5482 callOnMainThread([this, weakThis = WeakPtr { *this }, sample = Ref { sample }] { -
trunk/Source/WebCore/testing/Internals.h
r285610 r285984 1220 1220 #if ENABLE(MEDIA_STREAM) 1221 1221 // RealtimeMediaSource::Observer API 1222 void videoSampleAvailable(MediaSample& ) final;1222 void videoSampleAvailable(MediaSample&, VideoSampleMetadata) final; 1223 1223 // RealtimeMediaSource::AudioSampleObserver API 1224 1224 void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final { m_trackAudioSampleCount++; } -
trunk/Source/WebKit/ChangeLog
r285981 r285984 1 2021-11-17 Youenn Fablet <youenn@apple.com> 2 3 Add support for more rvfc metadata 4 https://bugs.webkit.org/show_bug.cgi?id=233185 5 6 Reviewed by Eric Carlson. 7 8 Make sure to receive frame metadats, send it through IPC to WebProcess and pipe it to media source observers. 9 10 * UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp: 11 * WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp: 12 * WebProcess/GPU/webrtc/MediaRecorderPrivate.h: 13 * WebProcess/cocoa/RemoteCaptureSampleManager.cpp: 14 * WebProcess/cocoa/RemoteCaptureSampleManager.h: 15 * WebProcess/cocoa/RemoteCaptureSampleManager.messages.in: 16 * WebProcess/cocoa/RemoteRealtimeDisplaySource.h: 17 * WebProcess/cocoa/RemoteRealtimeVideoSource.cpp: 18 * WebProcess/cocoa/RemoteRealtimeVideoSource.h: 19 1 20 2021-11-17 Myles C. Maxfield <mmaxfield@apple.com> 2 21 -
trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp
r284220 r285984 180 180 } 181 181 182 void videoSampleAvailable(MediaSample& sample ) final182 void videoSampleAvailable(MediaSample& sample, VideoSampleMetadata metadata) final 183 183 { 184 184 std::unique_ptr<RemoteVideoSample> remoteSample; … … 193 193 remoteSample->setOwnershipIdentity(*m_webProcessIdentityToken); 194 194 #endif 195 m_connection->send(Messages::RemoteCaptureSampleManager::VideoSampleAvailable(m_id, WTFMove(*remoteSample) ), 0);195 m_connection->send(Messages::RemoteCaptureSampleManager::VideoSampleAvailable(m_id, WTFMove(*remoteSample), metadata), 0); 196 196 } 197 197 } -
trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp
r284095 r285984 90 90 } 91 91 92 void MediaRecorderPrivate::videoSampleAvailable(MediaSample& sample )92 void MediaRecorderPrivate::videoSampleAvailable(MediaSample& sample, VideoSampleMetadata) 93 93 { 94 94 std::unique_ptr<RemoteVideoSample> remoteSample; -
trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h
r283431 r285984 57 57 private: 58 58 // WebCore::MediaRecorderPrivate 59 void videoSampleAvailable(WebCore::MediaSample& ) final;59 void videoSampleAvailable(WebCore::MediaSample&, WebCore::VideoSampleMetadata) final; 60 60 void fetchData(CompletionHandler<void(RefPtr<WebCore::SharedBuffer>&&, const String& mimeType, double)>&&) final; 61 61 void stopRecording(CompletionHandler<void()>&&) final; -
trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.cpp
r285520 r285984 151 151 } 152 152 153 void RemoteCaptureSampleManager::videoSampleAvailable(RealtimeMediaSourceIdentifier identifier, RemoteVideoSample&& sample )153 void RemoteCaptureSampleManager::videoSampleAvailable(RealtimeMediaSourceIdentifier identifier, RemoteVideoSample&& sample, VideoSampleMetadata metadata) 154 154 { 155 155 ASSERT(!WTF::isMainRunLoop()); … … 160 160 return; 161 161 } 162 iterator->value->videoSampleAvailable(WTFMove(sample) );162 iterator->value->videoSampleAvailable(WTFMove(sample), metadata); 163 163 } 164 164 … … 233 233 } 234 234 235 void RemoteCaptureSampleManager::RemoteVideo::videoSampleAvailable(RemoteVideoSample&& remoteSample )235 void RemoteCaptureSampleManager::RemoteVideo::videoSampleAvailable(RemoteVideoSample&& remoteSample, VideoSampleMetadata metadata) 236 236 { 237 237 if (!m_imageTransferSession || m_imageTransferSession->pixelFormat() != remoteSample.videoFormat()) … … 249 249 } 250 250 switchOn(m_source, [&](Ref<RemoteRealtimeVideoSource>& source) { 251 source->videoSampleAvailable(*sampleRef, remoteSample.size() );251 source->videoSampleAvailable(*sampleRef, remoteSample.size(), metadata); 252 252 }, [&](Ref<RemoteRealtimeDisplaySource>& source) { 253 source->remoteVideoSampleAvailable(*sampleRef );253 source->remoteVideoSampleAvailable(*sampleRef, metadata); 254 254 }); 255 255 } -
trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.h
r284444 r285984 71 71 void audioStorageChanged(WebCore::RealtimeMediaSourceIdentifier, const SharedMemory::IPCHandle&, const WebCore::CAAudioStreamDescription&, uint64_t numberOfFrames, IPC::Semaphore&&, const MediaTime&, size_t frameSampleSize); 72 72 void audioSamplesAvailable(WebCore::RealtimeMediaSourceIdentifier, MediaTime, uint64_t numberOfFrames); 73 void videoSampleAvailable(WebCore::RealtimeMediaSourceIdentifier, WebCore::RemoteVideoSample&& );73 void videoSampleAvailable(WebCore::RealtimeMediaSourceIdentifier, WebCore::RemoteVideoSample&&, WebCore::VideoSampleMetadata); 74 74 75 75 void setConnection(IPC::Connection*); … … 106 106 explicit RemoteVideo(Source&&); 107 107 108 void videoSampleAvailable(WebCore::RemoteVideoSample&& );108 void videoSampleAvailable(WebCore::RemoteVideoSample&&, WebCore::VideoSampleMetadata); 109 109 110 110 private: -
trunk/Source/WebKit/WebProcess/cocoa/RemoteCaptureSampleManager.messages.in
r277256 r285984 26 26 messages -> RemoteCaptureSampleManager NotRefCounted { 27 27 AudioStorageChanged(WebCore::RealtimeMediaSourceIdentifier id, WebKit::SharedMemory::IPCHandle storageHandle, WebCore::CAAudioStreamDescription description, uint64_t numberOfFrames, IPC::Semaphore captureSemaphore, MediaTime mediaTime, size_t frameChunkSize); 28 VideoSampleAvailable(WebCore::RealtimeMediaSourceIdentifier id, WebCore::RemoteVideoSample sample )28 VideoSampleAvailable(WebCore::RealtimeMediaSourceIdentifier id, WebCore::RemoteVideoSample sample, struct WebCore::VideoSampleMetadata metadata) 29 29 } 30 30 -
trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeDisplaySource.h
r284444 r285984 62 62 void captureFailed() final; 63 63 64 void remoteVideoSampleAvailable(WebCore::MediaSample& sample ) { videoSampleAvailable(sample); }64 void remoteVideoSampleAvailable(WebCore::MediaSample& sample, WebCore::VideoSampleMetadata metadata) { videoSampleAvailable(sample, metadata); } 65 65 void sourceMutedChanged(bool value) { notifyMutedChange(value); } 66 66 -
trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.cpp
r284444 r285984 113 113 } 114 114 115 void RemoteRealtimeVideoSource::videoSampleAvailable(MediaSample& sample, IntSize sampleSize )115 void RemoteRealtimeVideoSource::videoSampleAvailable(MediaSample& sample, IntSize sampleSize, VideoSampleMetadata metadata) 116 116 { 117 117 ASSERT(type() == Type::Video); … … 132 132 }); 133 133 } 134 dispatchMediaSampleToObservers(sample );134 dispatchMediaSampleToObservers(sample, metadata); 135 135 } 136 136 -
trunk/Source/WebKit/WebProcess/cocoa/RemoteRealtimeVideoSource.h
r283033 r285984 67 67 void captureFailed() final; 68 68 69 void videoSampleAvailable(WebCore::MediaSample&, WebCore::IntSize );69 void videoSampleAvailable(WebCore::MediaSample&, WebCore::IntSize, WebCore::VideoSampleMetadata); 70 70 void sourceMutedChanged(bool value) { notifyMutedChange(value); } 71 71
Note: See TracChangeset
for help on using the changeset viewer.