Changeset 270641 in webkit
- Timestamp:
- Dec 10, 2020 11:48:38 AM (20 months ago)
- Location:
- trunk
- Files:
-
- 10 edited
- 2 moved
-
LayoutTests/ChangeLog (modified) (1 diff)
-
LayoutTests/webrtc/video-sframe-expected.txt (modified) (1 diff)
-
LayoutTests/webrtc/video-sframe.html (modified) (4 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/Modules/mediastream/RTCRtpSFrameTransform.idl (modified) (1 diff)
-
Source/WebCore/Modules/mediastream/RTCRtpSFrameTransformer.cpp (modified) (4 diffs)
-
Source/WebCore/Modules/mediastream/RTCRtpSFrameTransformer.h (modified) (1 diff)
-
Source/WebCore/Modules/mediastream/SFrameUtils.cpp (moved) (moved from trunk/Source/WebCore/Modules/mediastream/H264Utils.cpp) (6 diffs)
-
Source/WebCore/Modules/mediastream/SFrameUtils.h (moved) (moved from trunk/Source/WebCore/Modules/mediastream/H264Utils.h) (3 diffs)
-
Source/WebCore/Sources.txt (modified) (2 diffs)
-
Source/WebCore/WebCore.xcodeproj/project.pbxproj (modified) (6 diffs)
-
Tools/TestWebKitAPI/Tests/WebCore/RTCRtpSFrameTransformerTests.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r270638 r270641 1 2020-12-10 Youenn Fablet <youenn@apple.com> 2 3 Add a SFrame VP8 experimental compatibility mode 4 https://bugs.webkit.org/show_bug.cgi?id=219674 5 6 Reviewed by Eric Carlson. 7 8 * webrtc/video-sframe-expected.txt: 9 * webrtc/video-sframe.html: 10 1 11 2020-12-10 Alex Christensen <achristensen@webkit.org> 2 12 -
trunk/LayoutTests/webrtc/video-sframe-expected.txt
r270506 r270641 3 3 PASS Video exchange with SFrame - H264 baseline 4 4 PASS Video exchange with SFrame - H264 high 5 PASS Video exchange with SFrame - VP8 5 6 -
trunk/LayoutTests/webrtc/video-sframe.html
r270620 r270641 11 11 <script src ="routines.js"></script> 12 12 <script> 13 async function doSFrameTest( selectCodec)13 async function doSFrameTest(codec, shouldClose) 14 14 { 15 let pc1, pc2; 15 16 let sender, receiver; 16 17 const localStream = await navigator.mediaDevices.getUserMedia({video: true}); … … 18 19 const stream = await new Promise((resolve, reject) => { 19 20 createConnections((firstConnection) => { 21 pc1 = firstConnection; 20 22 sender = firstConnection.addTrack(localStream.getTracks()[0], localStream); 23 firstConnection.getTransceivers()[0].setCodecPreferences([codec]); 21 24 let transform = new SFrameTransform({compatibilityMode: "H264"}); 22 25 transform.setEncryptionKey(key); 23 26 sender.transform = transform; 24 27 }, (secondConnection) => { 28 pc2 = secondConnection; 25 29 secondConnection.ontrack = (trackEvent) => { 26 30 let transform = new SFrameTransform({compatibilityMode: "H264"}); … … 30 34 resolve(trackEvent.streams[0]); 31 35 }; 32 }, { observeOffer : (offer) => {33 offer.sdp = selectCodec(offer.sdp);34 return offer;35 }36 36 }); 37 37 setTimeout(() => reject("Test timed out"), 5000); … … 51 51 assert_not_equals(internals.sframeCounter(sender.transform), senderCounter, "sender"); 52 52 } 53 if (shouldClose) { 54 pc1.close(); 55 pc2.close(); 56 } 53 57 } 54 58 55 59 promise_test((test) => { 56 return doSFrameTest( setH264BaselineCodec);60 return doSFrameTest({clockRate: 90000, mimeType: "video/H264", sdpFmtpLine: "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f"}, "H264", true); 57 61 }, "Video exchange with SFrame - H264 baseline"); 58 62 59 63 promise_test((test) => { 60 return doSFrameTest( setH264HighCodec);64 return doSFrameTest({clockRate: 90000, mimeType: "video/H264", sdpFmtpLine: "level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640c1f"}, "H264", true); 61 65 }, "Video exchange with SFrame - H264 high"); 66 67 promise_test((test) => { 68 return doSFrameTest({mimeType: "video/VP8", clockRate: 90000}, "VP8", false); 69 }, "Video exchange with SFrame - VP8"); 62 70 </script> 63 71 </body> -
trunk/Source/WebCore/ChangeLog
r270640 r270641 1 2020-12-10 Youenn Fablet <youenn@apple.com> 2 3 Add a SFrame VP8 experimental compatibility mode 4 https://bugs.webkit.org/show_bug.cgi?id=219674 5 6 Reviewed by Eric Carlson. 7 8 Similarly to H264, prefix the SFrame content with some data to ensure key frames or resolution can be detected 9 without revealing the actual content. 10 11 Covered by updated test. 12 13 * Modules/mediastream/RTCRtpSFrameTransform.idl: 14 * Modules/mediastream/RTCRtpSFrameTransformer.cpp: 15 (WebCore::RTCRtpSFrameTransformer::decryptFrame): 16 (WebCore::RTCRtpSFrameTransformer::encryptFrame): 17 * Modules/mediastream/RTCRtpSFrameTransformer.h: 18 * Modules/mediastream/SFrameUtils.cpp: Renamed from Source/WebCore/Modules/mediastream/H264Utils.cpp. 19 (WebCore::computeH264PrefixOffset): 20 (WebCore::computeH264PrefixBuffer): 21 (WebCore::isVP8KeyFrame): 22 (WebCore::computeVP8PrefixOffset): 23 (WebCore::computeVP8PrefixBuffer): 24 * Modules/mediastream/SFrameUtils.h: Renamed from Source/WebCore/Modules/mediastream/H264Utils.h. 25 * Sources.txt: 26 * WebCore.xcodeproj/project.pbxproj: 27 1 28 2020-12-10 Don Olmstead <don.olmstead@sony.com> 2 29 -
trunk/Source/WebCore/Modules/mediastream/RTCRtpSFrameTransform.idl
r270620 r270641 31 31 enum RTCRtpSFrameTransformCompatibilityMode { 32 32 "none", 33 "H264" 33 "H264", 34 "VP8" 34 35 }; 35 36 -
trunk/Source/WebCore/Modules/mediastream/RTCRtpSFrameTransformer.cpp
r270532 r270641 29 29 #if ENABLE(WEB_RTC) 30 30 31 #include " H264Utils.h"31 #include "SFrameUtils.h" 32 32 33 33 namespace WebCore { … … 197 197 { 198 198 Vector<uint8_t> buffer; 199 if (m_compatibilityMode == CompatibilityMode::H264) { 200 auto offset = computePrefixOffset(frameData, frameSize); 199 switch (m_compatibilityMode) { 200 case CompatibilityMode::H264: { 201 auto offset = computeH264PrefixOffset(frameData, frameSize); 201 202 frameData += offset; 202 203 frameSize -= offset; … … 206 207 frameSize = buffer.size(); 207 208 } 209 break; 210 } 211 case CompatibilityMode::VP8: { 212 auto offset = computeVP8PrefixOffset(frameData, frameSize); 213 frameData += offset; 214 frameSize -= offset; 215 break; 216 } 217 case CompatibilityMode::None: 218 break; 208 219 } 209 220 … … 260 271 261 272 Vector<uint8_t> transformedData; 262 H264PrefixBuffer prefixBuffer; 263 if (m_compatibilityMode == CompatibilityMode::H264) 264 prefixBuffer = computePrefixBuffer(frameData, frameSize); 273 SFrameCompatibilityPrefixBuffer prefixBuffer; 274 switch (m_compatibilityMode) { 275 case CompatibilityMode::H264: 276 prefixBuffer = computeH264PrefixBuffer(frameData, frameSize); 277 break; 278 case CompatibilityMode::VP8: 279 prefixBuffer = computeVP8PrefixBuffer(frameData, frameSize); 280 break; 281 case CompatibilityMode::None: 282 break; 283 } 265 284 266 285 auto locker = holdLock(m_keyLock); -
trunk/Source/WebCore/Modules/mediastream/RTCRtpSFrameTransformer.h
r270532 r270641 39 39 class RTCRtpSFrameTransformer : public ThreadSafeRefCounted<RTCRtpSFrameTransformer, WTF::DestructionThread::Main> { 40 40 public: 41 enum class CompatibilityMode { None, H264 };41 enum class CompatibilityMode { None, H264, VP8 }; 42 42 43 43 WEBCORE_EXPORT static Ref<RTCRtpSFrameTransformer> create(CompatibilityMode = CompatibilityMode::None); -
trunk/Source/WebCore/Modules/mediastream/SFrameUtils.cpp
r270640 r270641 25 25 26 26 #include "config.h" 27 #include " H264Utils.h"27 #include "SFrameUtils.h" 28 28 29 29 #if ENABLE(WEB_RTC) … … 61 61 } 62 62 63 size_t compute PrefixOffset(const uint8_t* frameData, size_t frameSize)63 size_t computeH264PrefixOffset(const uint8_t* frameData, size_t frameSize) 64 64 { 65 65 size_t offset = 0; … … 105 105 } 106 106 107 H264PrefixBuffer computePrefixBuffer(const uint8_t* frameData, size_t frameSize)107 SFrameCompatibilityPrefixBuffer computeH264PrefixBuffer(const uint8_t* frameData, size_t frameSize) 108 108 { 109 109 // Delta and key prefixes assume SPS/PPS with IDs equal to 0 have been transmitted. … … 115 115 // We assume a key frame starts with SPS, then PPS. Otherwise we wrap it as a delta frame. 116 116 if (!isSPSNALU(frameData[4])) 117 return H264PrefixBuffer { prefixDeltaFrame, sizeof(prefixDeltaFrame), { } };117 return SFrameCompatibilityPrefixBuffer { prefixDeltaFrame, sizeof(prefixDeltaFrame), { } }; 118 118 119 119 // Search for PPS … … 125 125 }); 126 126 if (!spsPpsLength) 127 return H264PrefixBuffer { prefixDeltaFrame, sizeof(prefixDeltaFrame), { } };127 return SFrameCompatibilityPrefixBuffer { prefixDeltaFrame, sizeof(prefixDeltaFrame), { } }; 128 128 129 129 // Search for next NALU to compute the real spsPpsLength, including the next 00 00 00 01. … … 182 182 } 183 183 184 static inline bool isVP8KeyFrame(const uint8_t* frame, size_t size) 185 { 186 ASSERT_UNUSED(size, size); 187 return !(*frame & 0x01); 188 } 189 190 size_t computeVP8PrefixOffset(const uint8_t* frame, size_t size) 191 { 192 return isVP8KeyFrame(frame, size) ? 10 : 3; 193 } 194 195 SFrameCompatibilityPrefixBuffer computeVP8PrefixBuffer(const uint8_t* frame, size_t size) 196 { 197 Vector<uint8_t> prefix; 198 prefix.append(frame, isVP8KeyFrame(frame, size) ? 10 : 3); 199 return { prefix.data(), prefix.size(), WTFMove(prefix) }; 200 } 201 184 202 } // namespace WebCore 185 203 -
trunk/Source/WebCore/Modules/mediastream/SFrameUtils.h
r270640 r270641 32 32 namespace WebCore { 33 33 34 struct H264PrefixBuffer {34 struct SFrameCompatibilityPrefixBuffer { 35 35 const uint8_t* data { nullptr }; 36 36 size_t size { 0 }; … … 38 38 }; 39 39 40 size_t compute PrefixOffset(const uint8_t*, size_t);41 H264PrefixBuffer computePrefixBuffer(const uint8_t*, size_t);40 size_t computeH264PrefixOffset(const uint8_t*, size_t); 41 SFrameCompatibilityPrefixBuffer computeH264PrefixBuffer(const uint8_t*, size_t); 42 42 43 43 WEBCORE_EXPORT bool needsRbspUnescaping(const uint8_t*, size_t); … … 45 45 WEBCORE_EXPORT void toRbsp(Vector<uint8_t>&, size_t); 46 46 47 size_t computeVP8PrefixOffset(const uint8_t*, size_t); 48 SFrameCompatibilityPrefixBuffer computeVP8PrefixBuffer(const uint8_t*, size_t); 49 47 50 } // namespace WebCore 48 51 -
trunk/Source/WebCore/Sources.txt
r270587 r270641 144 144 Modules/mediasource/VideoPlaybackQuality.cpp 145 145 Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp 146 Modules/mediastream/H264Utils.cpp147 146 Modules/mediastream/MediaDeviceInfo.cpp 148 147 Modules/mediastream/MediaDevices.cpp … … 178 177 Modules/mediastream/RTCSessionDescription.cpp 179 178 Modules/mediastream/RTCTrackEvent.cpp 179 Modules/mediastream/SFrameUtils.cpp 180 180 Modules/mediastream/UserMediaController.cpp 181 181 Modules/mediastream/UserMediaRequest.cpp -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r270587 r270641 1135 1135 41B2A6261EF1BF6D002B9D7A /* WebAudioSourceProvider.h in Headers */ = {isa = PBXBuildFile; fileRef = 41B2A6251EF1BF60002B9D7A /* WebAudioSourceProvider.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1136 1136 41B8776223DE1045003638B8 /* RealtimeMediaSourceIdentifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 41B8776023DE1042003638B8 /* RealtimeMediaSourceIdentifier.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1137 41BBA866257E373B00AC7F6D /* H264Utils.h in Headers */ = {isa = PBXBuildFile; fileRef = 41209E24257A2FBB00120ACA /* H264Utils.h */; settings = {ATTRIBUTES = (Private, ); }; };1137 41BBA866257E373B00AC7F6D /* SFrameUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 41209E24257A2FBB00120ACA /* SFrameUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1138 1138 41BF204922BA7BE80004F812 /* RealtimeVideoSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 41BF204022B947160004F812 /* RealtimeVideoSource.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1139 1139 41C760B10EDE03D300C1655F /* ScriptState.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C760B00EDE03D300C1655F /* ScriptState.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 7591 7591 41189EF71AD8232800B93F64 /* ReadableByteStreamController.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReadableByteStreamController.idl; sourceTree = "<group>"; }; 7592 7592 41189EF71AD8232800B95672 /* ReadableStreamBYOBRequest.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ReadableStreamBYOBRequest.idl; sourceTree = "<group>"; }; 7593 41209E24257A2FBB00120ACA /* H264Utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = H264Utils.h; sourceTree = "<group>"; };7594 41209E26257A2FBB00120ACA /* H264Utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = H264Utils.cpp; sourceTree = "<group>"; };7593 41209E24257A2FBB00120ACA /* SFrameUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SFrameUtils.h; sourceTree = "<group>"; }; 7594 41209E26257A2FBB00120ACA /* SFrameUtils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SFrameUtils.cpp; sourceTree = "<group>"; }; 7595 7595 41209E91216D593C00A73A12 /* RTCCertificate.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = RTCCertificate.idl; sourceTree = "<group>"; }; 7596 7596 41209E93216D5C7900A73A12 /* RTCCertificate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCCertificate.h; sourceTree = "<group>"; }; … … 17092 17092 93A806111E03B51C008A1F26 /* DoubleRange.h */, 17093 17093 93A806121E03B51C008A1F26 /* DoubleRange.idl */, 17094 41209E26257A2FBB00120ACA /* H264Utils.cpp */,17095 41209E24257A2FBB00120ACA /* H264Utils.h */,17096 17094 93A806131E03B51C008A1F26 /* LongRange.h */, 17097 17095 93A806141E03B51C008A1F26 /* LongRange.idl */, … … 17270 17268 5E2C43651BCEE3720001E2BC /* RTCTrackEvent.h */, 17271 17269 5E2C43661BCEE3720001E2BC /* RTCTrackEvent.idl */, 17270 41209E26257A2FBB00120ACA /* SFrameUtils.cpp */, 17271 41209E24257A2FBB00120ACA /* SFrameUtils.h */, 17272 17272 07221B8D17CEC32700848E51 /* UserMediaClient.h */, 17273 17273 07221B8E17CEC32700848E51 /* UserMediaController.cpp */, … … 32174 32174 A12A1050166444FD008FA311 /* GridTrackSize.h in Headers */, 32175 32175 E12DE7181E4B74A600F9ACCF /* GridTrackSizingAlgorithm.h in Headers */, 32176 41BBA866257E373B00AC7F6D /* H264Utils.h in Headers */,32177 32176 26EA89A71B4F2B75008C5FD2 /* HashableActionList.h in Headers */, 32178 32177 8482B7461198C35400BFB005 /* HashChangeEvent.h in Headers */, … … 34504 34503 7CD58DFB1F9565A500112791 /* Settings.h in Headers */, 34505 34504 7CC9722E1F93E3360004D4CF /* SettingsBase.h in Headers */, 34505 41BBA866257E373B00AC7F6D /* SFrameUtils.h in Headers */, 34506 34506 0F3DD45012F5EA1B000D9190 /* ShadowBlur.h in Headers */, 34507 34507 BC5EB8C40E82031B00B25965 /* ShadowData.h in Headers */, -
trunk/Tools/TestWebKitAPI/Tests/WebCore/RTCRtpSFrameTransformerTests.cpp
r270506 r270641 28 28 #if ENABLE(WEB_RTC) 29 29 30 #include <WebCore/H264Utils.h>31 30 #include <WebCore/RTCRtpSFrameTransformer.h> 31 #include <WebCore/SFrameUtils.h> 32 32 #include <wtf/Vector.h> 33 33
Note: See TracChangeset
for help on using the changeset viewer.