@sbhjt-gr/react-native-webrtc 124.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.clang-format +11 -0
- package/.claude/settings.local.json +9 -0
- package/.eslintignore +6 -0
- package/.nvmrc +1 -0
- package/ISSUE_TEMPLATE.md +40 -0
- package/LICENSE +22 -0
- package/README.md +103 -0
- package/android/build.gradle +37 -0
- package/android/consumer-rules.pro +3 -0
- package/android/src/main/AndroidManifest.xml +11 -0
- package/android/src/main/java/com/oney/WebRTCModule/AbstractVideoCaptureController.java +113 -0
- package/android/src/main/java/com/oney/WebRTCModule/CameraCaptureController.java +338 -0
- package/android/src/main/java/com/oney/WebRTCModule/CameraEventsHandler.java +49 -0
- package/android/src/main/java/com/oney/WebRTCModule/DataChannelWrapper.java +99 -0
- package/android/src/main/java/com/oney/WebRTCModule/DataPacketCryptorManager.java +63 -0
- package/android/src/main/java/com/oney/WebRTCModule/DisplayUtils.java +16 -0
- package/android/src/main/java/com/oney/WebRTCModule/EglUtils.java +66 -0
- package/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java +539 -0
- package/android/src/main/java/com/oney/WebRTCModule/LibraryLoader.java +21 -0
- package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionNotification.java +70 -0
- package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionService.java +82 -0
- package/android/src/main/java/com/oney/WebRTCModule/PeerConnectionObserver.java +588 -0
- package/android/src/main/java/com/oney/WebRTCModule/RTCCryptoManager.java +493 -0
- package/android/src/main/java/com/oney/WebRTCModule/RTCVideoViewManager.java +98 -0
- package/android/src/main/java/com/oney/WebRTCModule/ReactBridgeUtil.java +36 -0
- package/android/src/main/java/com/oney/WebRTCModule/ScreenCaptureController.java +94 -0
- package/android/src/main/java/com/oney/WebRTCModule/SerializeUtils.java +342 -0
- package/android/src/main/java/com/oney/WebRTCModule/StringUtils.java +101 -0
- package/android/src/main/java/com/oney/WebRTCModule/ThreadUtils.java +41 -0
- package/android/src/main/java/com/oney/WebRTCModule/TrackCapturerEventsEmitter.java +34 -0
- package/android/src/main/java/com/oney/WebRTCModule/VideoTrackAdapter.java +137 -0
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java +1643 -0
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModuleOptions.java +33 -0
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModulePackage.java +21 -0
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCView.java +583 -0
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraClient.java +464 -0
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraConfig.java +17 -0
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraListener.java +7 -0
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/ProcessorProvider.java +38 -0
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoEffectProcessor.java +59 -0
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessor.java +19 -0
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessorFactoryInterface.java +12 -0
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoDecoderFactory.java +73 -0
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoEncoderFactory.java +73 -0
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoDecoderFactoryProxy.java +36 -0
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoEncoderFactoryProxy.java +36 -0
- package/android/src/main/java/org/webrtc/Camera1Helper.java +54 -0
- package/android/src/main/java/org/webrtc/Camera2Helper.java +52 -0
- package/android/src/main/res/values/strings.xml +5 -0
- package/android/src/main/res/values/styles.xml +8 -0
- package/apple/.placeholder +0 -0
- package/ios/RCTWebRTC/CaptureController.h +18 -0
- package/ios/RCTWebRTC/CaptureController.m +29 -0
- package/ios/RCTWebRTC/CapturerEventsDelegate.h +12 -0
- package/ios/RCTWebRTC/DataChannelWrapper.h +27 -0
- package/ios/RCTWebRTC/DataChannelWrapper.m +42 -0
- package/ios/RCTWebRTC/I420Converter.h +22 -0
- package/ios/RCTWebRTC/I420Converter.m +164 -0
- package/ios/RCTWebRTC/PIPController.h +24 -0
- package/ios/RCTWebRTC/PIPController.m +234 -0
- package/ios/RCTWebRTC/PalabraAudioSink.h +13 -0
- package/ios/RCTWebRTC/PalabraAudioSink.m +18 -0
- package/ios/RCTWebRTC/PalabraClient.h +36 -0
- package/ios/RCTWebRTC/PalabraClient.m +584 -0
- package/ios/RCTWebRTC/RCTConvert+WebRTC.h +16 -0
- package/ios/RCTWebRTC/RCTConvert+WebRTC.m +206 -0
- package/ios/RCTWebRTC/RTCMediaStreamTrack+React.h +10 -0
- package/ios/RCTWebRTC/RTCMediaStreamTrack+React.m +16 -0
- package/ios/RCTWebRTC/RTCVideoViewManager.h +29 -0
- package/ios/RCTWebRTC/RTCVideoViewManager.m +411 -0
- package/ios/RCTWebRTC/SampleBufferVideoCallView.h +12 -0
- package/ios/RCTWebRTC/SampleBufferVideoCallView.m +178 -0
- package/ios/RCTWebRTC/ScreenCaptureController.h +20 -0
- package/ios/RCTWebRTC/ScreenCaptureController.m +83 -0
- package/ios/RCTWebRTC/ScreenCapturePickerViewManager.h +7 -0
- package/ios/RCTWebRTC/ScreenCapturePickerViewManager.m +60 -0
- package/ios/RCTWebRTC/ScreenCapturer.h +19 -0
- package/ios/RCTWebRTC/ScreenCapturer.m +264 -0
- package/ios/RCTWebRTC/SerializeUtils.h +28 -0
- package/ios/RCTWebRTC/SerializeUtils.m +314 -0
- package/ios/RCTWebRTC/SocketConnection.h +13 -0
- package/ios/RCTWebRTC/SocketConnection.m +137 -0
- package/ios/RCTWebRTC/TrackCapturerEventsEmitter.h +14 -0
- package/ios/RCTWebRTC/TrackCapturerEventsEmitter.m +37 -0
- package/ios/RCTWebRTC/VideoCaptureController.h +21 -0
- package/ios/RCTWebRTC/VideoCaptureController.m +328 -0
- package/ios/RCTWebRTC/WebRTCModule+Palabra.h +4 -0
- package/ios/RCTWebRTC/WebRTCModule+Palabra.m +83 -0
- package/ios/RCTWebRTC/WebRTCModule+Permissions.m +75 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCAudioSession.m +20 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.h +14 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.m +165 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCFrameCryptor.m +611 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.h +14 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m +533 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.h +24 -0
- package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m +1004 -0
- package/ios/RCTWebRTC/WebRTCModule+Transceivers.m +267 -0
- package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.h +12 -0
- package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.m +166 -0
- package/ios/RCTWebRTC/WebRTCModule.h +51 -0
- package/ios/RCTWebRTC/WebRTCModule.m +151 -0
- package/ios/RCTWebRTC/WebRTCModuleOptions.h +24 -0
- package/ios/RCTWebRTC/WebRTCModuleOptions.m +31 -0
- package/ios/RCTWebRTC/videoEffects/ProcessorProvider.h +9 -0
- package/ios/RCTWebRTC/videoEffects/ProcessorProvider.m +23 -0
- package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.h +13 -0
- package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.m +23 -0
- package/ios/RCTWebRTC/videoEffects/VideoFrameProcessor.h +8 -0
- package/ios/RCTWebRTC.xcodeproj/project.pbxproj +404 -0
- package/ios/RCTWebRTC.xcworkspace/contents.xcworkspacedata +10 -0
- package/lib/commonjs/Constraints.js +2 -0
- package/lib/commonjs/Constraints.js.map +1 -0
- package/lib/commonjs/EventEmitter.js +51 -0
- package/lib/commonjs/EventEmitter.js.map +1 -0
- package/lib/commonjs/Logger.js +47 -0
- package/lib/commonjs/Logger.js.map +1 -0
- package/lib/commonjs/MediaDevices.js +54 -0
- package/lib/commonjs/MediaDevices.js.map +1 -0
- package/lib/commonjs/MediaStream.js +137 -0
- package/lib/commonjs/MediaStream.js.map +1 -0
- package/lib/commonjs/MediaStreamError.js +19 -0
- package/lib/commonjs/MediaStreamError.js.map +1 -0
- package/lib/commonjs/MediaStreamErrorEvent.js +17 -0
- package/lib/commonjs/MediaStreamErrorEvent.js.map +1 -0
- package/lib/commonjs/MediaStreamTrack.js +203 -0
- package/lib/commonjs/MediaStreamTrack.js.map +1 -0
- package/lib/commonjs/MediaStreamTrackEvent.js +26 -0
- package/lib/commonjs/MediaStreamTrackEvent.js.map +1 -0
- package/lib/commonjs/MessageEvent.js +27 -0
- package/lib/commonjs/MessageEvent.js.map +1 -0
- package/lib/commonjs/Permissions.js +116 -0
- package/lib/commonjs/Permissions.js.map +1 -0
- package/lib/commonjs/RTCAudioSession.js +33 -0
- package/lib/commonjs/RTCAudioSession.js.map +1 -0
- package/lib/commonjs/RTCDataChannel.js +165 -0
- package/lib/commonjs/RTCDataChannel.js.map +1 -0
- package/lib/commonjs/RTCDataChannelEvent.js +26 -0
- package/lib/commonjs/RTCDataChannelEvent.js.map +1 -0
- package/lib/commonjs/RTCDataPacketCryptor.js +76 -0
- package/lib/commonjs/RTCDataPacketCryptor.js.map +1 -0
- package/lib/commonjs/RTCDataPacketCryptorFactory.js +27 -0
- package/lib/commonjs/RTCDataPacketCryptorFactory.js.map +1 -0
- package/lib/commonjs/RTCErrorEvent.js +23 -0
- package/lib/commonjs/RTCErrorEvent.js.map +1 -0
- package/lib/commonjs/RTCFrameCryptor.js +138 -0
- package/lib/commonjs/RTCFrameCryptor.js.map +1 -0
- package/lib/commonjs/RTCFrameCryptorFactory.js +81 -0
- package/lib/commonjs/RTCFrameCryptorFactory.js.map +1 -0
- package/lib/commonjs/RTCIceCandidate.js +34 -0
- package/lib/commonjs/RTCIceCandidate.js.map +1 -0
- package/lib/commonjs/RTCIceCandidateEvent.js +28 -0
- package/lib/commonjs/RTCIceCandidateEvent.js.map +1 -0
- package/lib/commonjs/RTCKeyProvider.js +111 -0
- package/lib/commonjs/RTCKeyProvider.js.map +1 -0
- package/lib/commonjs/RTCPIPView.js +38 -0
- package/lib/commonjs/RTCPIPView.js.map +1 -0
- package/lib/commonjs/RTCPIPView.web.js +23 -0
- package/lib/commonjs/RTCPIPView.web.js.map +1 -0
- package/lib/commonjs/RTCPeerConnection.js +694 -0
- package/lib/commonjs/RTCPeerConnection.js.map +1 -0
- package/lib/commonjs/RTCRtcpParameters.js +24 -0
- package/lib/commonjs/RTCRtcpParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpCapabilities.js +22 -0
- package/lib/commonjs/RTCRtpCapabilities.js.map +1 -0
- package/lib/commonjs/RTCRtpCodecCapability.js +19 -0
- package/lib/commonjs/RTCRtpCodecCapability.js.map +1 -0
- package/lib/commonjs/RTCRtpCodecParameters.js +38 -0
- package/lib/commonjs/RTCRtpCodecParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpEncodingParameters.js +78 -0
- package/lib/commonjs/RTCRtpEncodingParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpHeaderExtension.js +27 -0
- package/lib/commonjs/RTCRtpHeaderExtension.js.map +1 -0
- package/lib/commonjs/RTCRtpParameters.js +35 -0
- package/lib/commonjs/RTCRtpParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpReceiveParameters.js +15 -0
- package/lib/commonjs/RTCRtpReceiveParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpReceiver.js +53 -0
- package/lib/commonjs/RTCRtpReceiver.js.map +1 -0
- package/lib/commonjs/RTCRtpSendParameters.js +49 -0
- package/lib/commonjs/RTCRtpSendParameters.js.map +1 -0
- package/lib/commonjs/RTCRtpSender.js +67 -0
- package/lib/commonjs/RTCRtpSender.js.map +1 -0
- package/lib/commonjs/RTCRtpTransceiver.js +81 -0
- package/lib/commonjs/RTCRtpTransceiver.js.map +1 -0
- package/lib/commonjs/RTCSessionDescription.js +33 -0
- package/lib/commonjs/RTCSessionDescription.js.map +1 -0
- package/lib/commonjs/RTCTrackEvent.js +38 -0
- package/lib/commonjs/RTCTrackEvent.js.map +1 -0
- package/lib/commonjs/RTCUtil.js +186 -0
- package/lib/commonjs/RTCUtil.js.map +1 -0
- package/lib/commonjs/RTCView.js +16 -0
- package/lib/commonjs/RTCView.js.map +1 -0
- package/lib/commonjs/RTCView.web.js +62 -0
- package/lib/commonjs/RTCView.web.js.map +1 -0
- package/lib/commonjs/ScreenCapturePickerView.js +10 -0
- package/lib/commonjs/ScreenCapturePickerView.js.map +1 -0
- package/lib/commonjs/ScreenCapturePickerView.web.js +10 -0
- package/lib/commonjs/ScreenCapturePickerView.web.js.map +1 -0
- package/lib/commonjs/getDisplayMedia.js +33 -0
- package/lib/commonjs/getDisplayMedia.js.map +1 -0
- package/lib/commonjs/getUserMedia.js +101 -0
- package/lib/commonjs/getUserMedia.js.map +1 -0
- package/lib/commonjs/index.js +224 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/index.web.js +175 -0
- package/lib/commonjs/index.web.js.map +1 -0
- package/lib/commonjs/webStream.js +35 -0
- package/lib/commonjs/webStream.js.map +1 -0
- package/lib/module/Constraints.js +2 -0
- package/lib/module/Constraints.js.map +1 -0
- package/lib/module/EventEmitter.js +41 -0
- package/lib/module/EventEmitter.js.map +1 -0
- package/lib/module/Logger.js +39 -0
- package/lib/module/Logger.js.map +1 -0
- package/lib/module/MediaDevices.js +46 -0
- package/lib/module/MediaDevices.js.map +1 -0
- package/lib/module/MediaStream.js +129 -0
- package/lib/module/MediaStream.js.map +1 -0
- package/lib/module/MediaStreamError.js +12 -0
- package/lib/module/MediaStreamError.js.map +1 -0
- package/lib/module/MediaStreamErrorEvent.js +10 -0
- package/lib/module/MediaStreamErrorEvent.js.map +1 -0
- package/lib/module/MediaStreamTrack.js +195 -0
- package/lib/module/MediaStreamTrack.js.map +1 -0
- package/lib/module/MediaStreamTrackEvent.js +19 -0
- package/lib/module/MediaStreamTrackEvent.js.map +1 -0
- package/lib/module/MessageEvent.js +20 -0
- package/lib/module/MessageEvent.js.map +1 -0
- package/lib/module/Permissions.js +109 -0
- package/lib/module/Permissions.js.map +1 -0
- package/lib/module/RTCAudioSession.js +26 -0
- package/lib/module/RTCAudioSession.js.map +1 -0
- package/lib/module/RTCDataChannel.js +155 -0
- package/lib/module/RTCDataChannel.js.map +1 -0
- package/lib/module/RTCDataChannelEvent.js +19 -0
- package/lib/module/RTCDataChannelEvent.js.map +1 -0
- package/lib/module/RTCDataPacketCryptor.js +66 -0
- package/lib/module/RTCDataPacketCryptor.js.map +1 -0
- package/lib/module/RTCDataPacketCryptorFactory.js +19 -0
- package/lib/module/RTCDataPacketCryptorFactory.js.map +1 -0
- package/lib/module/RTCErrorEvent.js +16 -0
- package/lib/module/RTCErrorEvent.js.map +1 -0
- package/lib/module/RTCFrameCryptor.js +128 -0
- package/lib/module/RTCFrameCryptor.js.map +1 -0
- package/lib/module/RTCFrameCryptorFactory.js +70 -0
- package/lib/module/RTCFrameCryptorFactory.js.map +1 -0
- package/lib/module/RTCIceCandidate.js +27 -0
- package/lib/module/RTCIceCandidate.js.map +1 -0
- package/lib/module/RTCIceCandidateEvent.js +21 -0
- package/lib/module/RTCIceCandidateEvent.js.map +1 -0
- package/lib/module/RTCKeyProvider.js +101 -0
- package/lib/module/RTCKeyProvider.js.map +1 -0
- package/lib/module/RTCPIPView.js +26 -0
- package/lib/module/RTCPIPView.js.map +1 -0
- package/lib/module/RTCPIPView.web.js +11 -0
- package/lib/module/RTCPIPView.web.js.map +1 -0
- package/lib/module/RTCPeerConnection.js +684 -0
- package/lib/module/RTCPeerConnection.js.map +1 -0
- package/lib/module/RTCRtcpParameters.js +17 -0
- package/lib/module/RTCRtcpParameters.js.map +1 -0
- package/lib/module/RTCRtpCapabilities.js +15 -0
- package/lib/module/RTCRtpCapabilities.js.map +1 -0
- package/lib/module/RTCRtpCodecCapability.js +12 -0
- package/lib/module/RTCRtpCodecCapability.js.map +1 -0
- package/lib/module/RTCRtpCodecParameters.js +31 -0
- package/lib/module/RTCRtpCodecParameters.js.map +1 -0
- package/lib/module/RTCRtpEncodingParameters.js +71 -0
- package/lib/module/RTCRtpEncodingParameters.js.map +1 -0
- package/lib/module/RTCRtpHeaderExtension.js +20 -0
- package/lib/module/RTCRtpHeaderExtension.js.map +1 -0
- package/lib/module/RTCRtpParameters.js +27 -0
- package/lib/module/RTCRtpParameters.js.map +1 -0
- package/lib/module/RTCRtpReceiveParameters.js +7 -0
- package/lib/module/RTCRtpReceiveParameters.js.map +1 -0
- package/lib/module/RTCRtpReceiver.js +45 -0
- package/lib/module/RTCRtpReceiver.js.map +1 -0
- package/lib/module/RTCRtpSendParameters.js +41 -0
- package/lib/module/RTCRtpSendParameters.js.map +1 -0
- package/lib/module/RTCRtpSender.js +59 -0
- package/lib/module/RTCRtpSender.js.map +1 -0
- package/lib/module/RTCRtpTransceiver.js +74 -0
- package/lib/module/RTCRtpTransceiver.js.map +1 -0
- package/lib/module/RTCSessionDescription.js +26 -0
- package/lib/module/RTCSessionDescription.js.map +1 -0
- package/lib/module/RTCTrackEvent.js +31 -0
- package/lib/module/RTCTrackEvent.js.map +1 -0
- package/lib/module/RTCUtil.js +176 -0
- package/lib/module/RTCUtil.js.map +1 -0
- package/lib/module/RTCView.js +11 -0
- package/lib/module/RTCView.js.map +1 -0
- package/lib/module/RTCView.web.js +54 -0
- package/lib/module/RTCView.web.js.map +1 -0
- package/lib/module/ScreenCapturePickerView.js +3 -0
- package/lib/module/ScreenCapturePickerView.js.map +1 -0
- package/lib/module/ScreenCapturePickerView.web.js +4 -0
- package/lib/module/ScreenCapturePickerView.web.js.map +1 -0
- package/lib/module/getDisplayMedia.js +26 -0
- package/lib/module/getDisplayMedia.js.map +1 -0
- package/lib/module/getUserMedia.js +92 -0
- package/lib/module/getUserMedia.js.map +1 -0
- package/lib/module/index.js +60 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/index.web.js +114 -0
- package/lib/module/index.web.js.map +1 -0
- package/lib/module/webStream.js +27 -0
- package/lib/module/webStream.js.map +1 -0
- package/lib/typescript/Constraints.d.ts +19 -0
- package/lib/typescript/EventEmitter.d.ts +6 -0
- package/lib/typescript/Logger.d.ts +13 -0
- package/lib/typescript/MediaDevices.d.ts +30 -0
- package/lib/typescript/MediaStream.d.ts +48 -0
- package/lib/typescript/MediaStreamError.d.ts +6 -0
- package/lib/typescript/MediaStreamErrorEvent.d.ts +6 -0
- package/lib/typescript/MediaStreamTrack.d.ts +101 -0
- package/lib/typescript/MediaStreamTrackEvent.d.ts +19 -0
- package/lib/typescript/MessageEvent.d.ts +20 -0
- package/lib/typescript/Permissions.d.ts +55 -0
- package/lib/typescript/RTCAudioSession.d.ts +10 -0
- package/lib/typescript/RTCDataChannel.d.ts +43 -0
- package/lib/typescript/RTCDataChannelEvent.d.ts +19 -0
- package/lib/typescript/RTCDataPacketCryptor.d.ts +12 -0
- package/lib/typescript/RTCDataPacketCryptorFactory.d.ts +6 -0
- package/lib/typescript/RTCErrorEvent.d.ts +12 -0
- package/lib/typescript/RTCFrameCryptor.d.ts +47 -0
- package/lib/typescript/RTCFrameCryptorFactory.d.ts +21 -0
- package/lib/typescript/RTCIceCandidate.d.ts +17 -0
- package/lib/typescript/RTCIceCandidateEvent.d.ts +20 -0
- package/lib/typescript/RTCKeyProvider.d.ts +21 -0
- package/lib/typescript/RTCPIPView.d.ts +15 -0
- package/lib/typescript/RTCPIPView.web.d.ts +13 -0
- package/lib/typescript/RTCPeerConnection.d.ts +117 -0
- package/lib/typescript/RTCRtcpParameters.d.ts +10 -0
- package/lib/typescript/RTCRtpCapabilities.d.ts +9 -0
- package/lib/typescript/RTCRtpCodecCapability.d.ts +7 -0
- package/lib/typescript/RTCRtpCodecParameters.d.ts +16 -0
- package/lib/typescript/RTCRtpEncodingParameters.d.ts +23 -0
- package/lib/typescript/RTCRtpHeaderExtension.d.ts +12 -0
- package/lib/typescript/RTCRtpParameters.d.ts +19 -0
- package/lib/typescript/RTCRtpReceiveParameters.d.ts +4 -0
- package/lib/typescript/RTCRtpReceiver.d.ts +21 -0
- package/lib/typescript/RTCRtpSendParameters.d.ts +20 -0
- package/lib/typescript/RTCRtpSender.d.ts +22 -0
- package/lib/typescript/RTCRtpTransceiver.d.ts +31 -0
- package/lib/typescript/RTCSessionDescription.d.ts +12 -0
- package/lib/typescript/RTCTrackEvent.d.ts +29 -0
- package/lib/typescript/RTCUtil.d.ts +37 -0
- package/lib/typescript/RTCView.d.ts +117 -0
- package/lib/typescript/RTCView.web.d.ts +25 -0
- package/lib/typescript/ScreenCapturePickerView.d.ts +2 -0
- package/lib/typescript/ScreenCapturePickerView.web.d.ts +1 -0
- package/lib/typescript/getDisplayMedia.d.ts +2 -0
- package/lib/typescript/getUserMedia.d.ts +7 -0
- package/lib/typescript/index.d.ts +22 -0
- package/lib/typescript/index.web.d.ts +101 -0
- package/lib/typescript/webStream.d.ts +3 -0
- package/livekit-react-native-webrtc.podspec +29 -0
- package/macos/RCTWebRTC.xcodeproj/project.pbxproj +324 -0
- package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/metro.config.js +7 -0
- package/metro.config.macos.js +14 -0
- package/package.json +66 -0
- package/react-native.config.js +11 -0
- package/src/.eslintrc.cjs +67 -0
- package/src/Constraints.ts +21 -0
- package/src/EventEmitter.ts +65 -0
- package/src/Logger.ts +49 -0
- package/src/MediaDevices.ts +53 -0
- package/src/MediaStream.ts +161 -0
- package/src/MediaStreamError.ts +12 -0
- package/src/MediaStreamErrorEvent.ts +11 -0
- package/src/MediaStreamTrack.ts +284 -0
- package/src/MediaStreamTrackEvent.ts +25 -0
- package/src/MessageEvent.ts +26 -0
- package/src/Permissions.ts +133 -0
- package/src/RTCAudioSession.ts +25 -0
- package/src/RTCDataChannel.ts +190 -0
- package/src/RTCDataChannelEvent.ts +28 -0
- package/src/RTCDataPacketCryptor.ts +90 -0
- package/src/RTCDataPacketCryptorFactory.ts +25 -0
- package/src/RTCErrorEvent.ts +21 -0
- package/src/RTCFrameCryptor.ts +163 -0
- package/src/RTCFrameCryptorFactory.ts +102 -0
- package/src/RTCIceCandidate.ts +29 -0
- package/src/RTCIceCandidateEvent.ts +26 -0
- package/src/RTCKeyProvider.ts +117 -0
- package/src/RTCPIPView.tsx +47 -0
- package/src/RTCPIPView.web.tsx +18 -0
- package/src/RTCPeerConnection.ts +832 -0
- package/src/RTCRtcpParameters.ts +23 -0
- package/src/RTCRtpCapabilities.ts +16 -0
- package/src/RTCRtpCodecCapability.ts +13 -0
- package/src/RTCRtpCodecParameters.ts +44 -0
- package/src/RTCRtpEncodingParameters.ts +90 -0
- package/src/RTCRtpHeaderExtension.ts +27 -0
- package/src/RTCRtpParameters.ts +37 -0
- package/src/RTCRtpReceiveParameters.ts +7 -0
- package/src/RTCRtpReceiver.ts +60 -0
- package/src/RTCRtpSendParameters.ts +63 -0
- package/src/RTCRtpSender.ts +78 -0
- package/src/RTCRtpTransceiver.ts +107 -0
- package/src/RTCSessionDescription.ts +30 -0
- package/src/RTCTrackEvent.ts +42 -0
- package/src/RTCUtil.ts +211 -0
- package/src/RTCView.ts +122 -0
- package/src/RTCView.web.tsx +82 -0
- package/src/ScreenCapturePickerView.ts +4 -0
- package/src/ScreenCapturePickerView.web.tsx +3 -0
- package/src/getDisplayMedia.ts +30 -0
- package/src/getUserMedia.ts +111 -0
- package/src/index.ts +107 -0
- package/src/index.web.ts +191 -0
- package/src/webStream.ts +33 -0
- package/tools/format.sh +6 -0
- package/tools/release.sh +45 -0
- package/tsconfig.json +17 -0
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
#import "SampleBufferVideoCallView.h"
|
|
2
|
+
#import <Accelerate/Accelerate.h>
|
|
3
|
+
#import <WebRTC/WebRTC.h>
|
|
4
|
+
#import "I420Converter.h"
|
|
5
|
+
|
|
6
|
+
@protocol SampleBufferRendering<AVQueuedSampleBufferRendering>
|
|
7
|
+
|
|
8
|
+
- (BOOL)requiresFlushToResumeDecoding;
|
|
9
|
+
|
|
10
|
+
@end
|
|
11
|
+
|
|
12
|
+
/** These classes already implement the required methods. */
|
|
13
|
+
@interface AVSampleBufferDisplayLayer ()<SampleBufferRendering>
|
|
14
|
+
@end
|
|
15
|
+
@interface AVSampleBufferVideoRenderer ()<SampleBufferRendering>
|
|
16
|
+
@end
|
|
17
|
+
|
|
18
|
+
@interface SampleBufferVideoCallView ()
|
|
19
|
+
|
|
20
|
+
@property(nonatomic, retain) I420Converter *i420Converter;
|
|
21
|
+
@property(nonatomic, strong) id<SampleBufferRendering> renderer;
|
|
22
|
+
@property(nonatomic, assign) NSInteger currentRotation;
|
|
23
|
+
|
|
24
|
+
@end
|
|
25
|
+
|
|
26
|
+
@implementation SampleBufferVideoCallView
|
|
27
|
+
|
|
28
|
+
+ (Class)layerClass {
|
|
29
|
+
return [AVSampleBufferDisplayLayer class];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
- (instancetype)initWithFrame:(CGRect)frame {
|
|
33
|
+
if (self = [super initWithFrame:frame]) {
|
|
34
|
+
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
35
|
+
selector:@selector(layerFailedToDecode:)
|
|
36
|
+
name:AVSampleBufferDisplayLayerFailedToDecodeNotification
|
|
37
|
+
object:self.sampleBufferLayer];
|
|
38
|
+
if (@available(iOS 17.0, *)) {
|
|
39
|
+
_renderer = self.sampleBufferLayer.sampleBufferRenderer;
|
|
40
|
+
} else {
|
|
41
|
+
_renderer = self.sampleBufferLayer;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return self;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
- (void)layerFailedToDecode:(NSNotification *)note {
|
|
48
|
+
NSError *error = [[note userInfo] valueForKey:AVSampleBufferDisplayLayerFailedToDecodeNotificationErrorKey];
|
|
49
|
+
NSLog(@"layerFailedToDecode, error: %@", [error localizedDescription]);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
- (AVSampleBufferDisplayLayer *)sampleBufferLayer {
|
|
53
|
+
return (AVSampleBufferDisplayLayer *)self.layer;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
- (void)requestScaleRecalculation {
|
|
57
|
+
_currentRotation = -1;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
- (void)recalculateScale:(RTCVideoRotation)rotation {
|
|
61
|
+
if (self.currentRotation != rotation) {
|
|
62
|
+
self.currentRotation = rotation;
|
|
63
|
+
|
|
64
|
+
CGFloat scale = 1;
|
|
65
|
+
if (rotation == 90 || rotation == 270) {
|
|
66
|
+
CGSize size = self.bounds.size;
|
|
67
|
+
scale = size.height / size.width;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
self.sampleBufferLayer.transform = CATransform3DConcat(
|
|
71
|
+
CATransform3DMakeRotation(rotation / 180.0 * M_PI, 0.0, 0.0, 1.0), CATransform3DMakeScale(scale, scale, 1));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** The size of the video frame. */
|
|
76
|
+
- (void)setSize:(CGSize)size {
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** The frame to be displayed. */
|
|
80
|
+
- (void)renderFrame:(nullable RTC_OBJC_TYPE(RTCVideoFrame) *)frame {
|
|
81
|
+
if (!_shouldRender) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Convert RTCVideoFrame to CMSampleBuffer
|
|
86
|
+
CMSampleBufferRef sampleBuffer = [self sampleBufferFrom:frame];
|
|
87
|
+
if (sampleBuffer == nil) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
92
|
+
if (self.renderer.requiresFlushToResumeDecoding) {
|
|
93
|
+
[self.renderer flush];
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (!self.renderer.readyForMoreMediaData) {
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
[self recalculateScale:frame.rotation];
|
|
101
|
+
|
|
102
|
+
// Display the CMSampleBuffer using AVSampleBufferDisplayLayer
|
|
103
|
+
[self.renderer enqueueSampleBuffer:sampleBuffer];
|
|
104
|
+
CFRelease(sampleBuffer);
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
- (CMSampleBufferRef)sampleBufferFrom:(RTCVideoFrame *)rtcVideoFrame {
|
|
109
|
+
// Convert RTCVideoFrame to CMSampleBuffer
|
|
110
|
+
|
|
111
|
+
// Assuming your RTCVideoFrame contains pixelBuffer
|
|
112
|
+
CVPixelBufferRef pixelBuffer = [self pixelBufferFrom:rtcVideoFrame];
|
|
113
|
+
if (!pixelBuffer) {
|
|
114
|
+
return nil;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Create a CMVideoFormatDescription
|
|
118
|
+
CMVideoFormatDescriptionRef formatDescription;
|
|
119
|
+
CMVideoFormatDescriptionCreateForImageBuffer(kCFAllocatorDefault, pixelBuffer, &formatDescription);
|
|
120
|
+
|
|
121
|
+
// Create CMSampleTimingInfo
|
|
122
|
+
// Timescale is 90khz according to RTCVideoFrame.h
|
|
123
|
+
CMSampleTimingInfo timingInfo;
|
|
124
|
+
timingInfo.presentationTimeStamp = CMTimeMake(rtcVideoFrame.timeStamp, 90000);
|
|
125
|
+
timingInfo.decodeTimeStamp = CMTimeMake(rtcVideoFrame.timeStamp, 90000);
|
|
126
|
+
|
|
127
|
+
// Create CMSampleBuffer
|
|
128
|
+
CMSampleBufferRef sampleBuffer;
|
|
129
|
+
CMSampleBufferCreateForImageBuffer(
|
|
130
|
+
kCFAllocatorDefault, pixelBuffer, true, nil, nil, formatDescription, &timingInfo, &sampleBuffer);
|
|
131
|
+
|
|
132
|
+
CFArrayRef attachments = CMSampleBufferGetSampleAttachmentsArray(sampleBuffer, YES);
|
|
133
|
+
CFMutableDictionaryRef dict = (CFMutableDictionaryRef)CFArrayGetValueAtIndex(attachments, 0);
|
|
134
|
+
|
|
135
|
+
CFDictionarySetValue(dict, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanTrue);
|
|
136
|
+
CVPixelBufferRelease(pixelBuffer);
|
|
137
|
+
return sampleBuffer;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* The CVPixelBufferRef returned from this function must be released when finished using it.
|
|
142
|
+
*/
|
|
143
|
+
- (CVPixelBufferRef)pixelBufferFrom:(RTCVideoFrame *)videoFrame {
|
|
144
|
+
if ([videoFrame.buffer isKindOfClass:[RTCCVPixelBuffer class]]) {
|
|
145
|
+
CVPixelBufferRef pixelBuffer = [((RTCCVPixelBuffer *)videoFrame.buffer) pixelBuffer];
|
|
146
|
+
CVPixelBufferRetain(pixelBuffer);
|
|
147
|
+
return [((RTCCVPixelBuffer *)videoFrame.buffer) pixelBuffer];
|
|
148
|
+
} else {
|
|
149
|
+
return [self pixelBufferFromI420:[videoFrame.buffer toI420]];
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* The CVPixelBufferRef returned from this function must be released when finished using it.
|
|
155
|
+
*/
|
|
156
|
+
- (CVPixelBufferRef)pixelBufferFromI420:(RTCI420Buffer *)i420Buffer {
|
|
157
|
+
if (_i420Converter == nil) {
|
|
158
|
+
I420Converter *converter = [[I420Converter alloc] init];
|
|
159
|
+
vImage_Error err = [converter prepareForAccelerateConversion];
|
|
160
|
+
|
|
161
|
+
if (err != kvImageNoError) {
|
|
162
|
+
NSLog(@"Error when preparing i420Converter: %ld", err);
|
|
163
|
+
return NULL;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
_i420Converter = converter;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
CVPixelBufferRef convertedPixelBuffer = [_i420Converter convertI420ToPixelBuffer:i420Buffer];
|
|
170
|
+
|
|
171
|
+
return convertedPixelBuffer;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
- (void)dealloc {
|
|
175
|
+
[_i420Converter unprepareForAccelerateConversion];
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
@end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#import <Foundation/Foundation.h>
|
|
2
|
+
#import "CaptureController.h"
|
|
3
|
+
#import "CapturerEventsDelegate.h"
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
extern NSString *const kRTCScreensharingSocketFD;
|
|
8
|
+
extern NSString *const kRTCAppGroupIdentifier;
|
|
9
|
+
|
|
10
|
+
@class ScreenCapturer;
|
|
11
|
+
|
|
12
|
+
@interface ScreenCaptureController : CaptureController
|
|
13
|
+
|
|
14
|
+
- (instancetype)initWithCapturer:(nonnull ScreenCapturer *)capturer;
|
|
15
|
+
- (void)startCapture;
|
|
16
|
+
- (void)stopCapture;
|
|
17
|
+
|
|
18
|
+
@end
|
|
19
|
+
|
|
20
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
#if TARGET_OS_IOS
|
|
2
|
+
|
|
3
|
+
#import "ScreenCaptureController.h"
|
|
4
|
+
#import "ScreenCapturer.h"
|
|
5
|
+
#import "SocketConnection.h"
|
|
6
|
+
|
|
7
|
+
NSString *const kRTCScreensharingSocketFD = @"rtc_SSFD";
|
|
8
|
+
NSString *const kRTCAppGroupIdentifier = @"RTCAppGroupIdentifier";
|
|
9
|
+
|
|
10
|
+
@interface ScreenCaptureController ()
|
|
11
|
+
|
|
12
|
+
@property(nonatomic, retain) ScreenCapturer *capturer;
|
|
13
|
+
|
|
14
|
+
@end
|
|
15
|
+
|
|
16
|
+
@interface ScreenCaptureController (CapturerEventsDelegate)<CapturerEventsDelegate>
|
|
17
|
+
- (void)capturerDidEnd:(RTCVideoCapturer *)capturer;
|
|
18
|
+
@end
|
|
19
|
+
|
|
20
|
+
@interface ScreenCaptureController (Private)
|
|
21
|
+
|
|
22
|
+
@property(nonatomic, readonly) NSString *appGroupIdentifier;
|
|
23
|
+
|
|
24
|
+
@end
|
|
25
|
+
|
|
26
|
+
@implementation ScreenCaptureController
|
|
27
|
+
|
|
28
|
+
- (instancetype)initWithCapturer:(nonnull ScreenCapturer *)capturer {
|
|
29
|
+
self = [super init];
|
|
30
|
+
if (self) {
|
|
31
|
+
self.capturer = capturer;
|
|
32
|
+
self.deviceId = @"screen-capture";
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
return self;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
- (void)dealloc {
|
|
39
|
+
[self.capturer stopCapture];
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
- (void)startCapture {
|
|
43
|
+
if (!self.appGroupIdentifier) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
self.capturer.eventsDelegate = self;
|
|
48
|
+
NSString *socketFilePath = [self filePathForApplicationGroupIdentifier:self.appGroupIdentifier];
|
|
49
|
+
SocketConnection *connection = [[SocketConnection alloc] initWithFilePath:socketFilePath];
|
|
50
|
+
[self.capturer startCaptureWithConnection:connection];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
- (void)stopCapture {
|
|
54
|
+
[self.capturer stopCapture];
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
- (NSDictionary *)getSettings {
|
|
58
|
+
return @{@"deviceId" : self.deviceId, @"groupId" : @"", @"frameRate" : @(30)};
|
|
59
|
+
}
|
|
60
|
+
// MARK: CapturerEventsDelegate Methods
|
|
61
|
+
|
|
62
|
+
- (void)capturerDidEnd:(RTCVideoCapturer *)capturer {
|
|
63
|
+
[self.eventsDelegate capturerDidEnd:capturer];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// MARK: Private Methods
|
|
67
|
+
|
|
68
|
+
- (NSString *)appGroupIdentifier {
|
|
69
|
+
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
|
|
70
|
+
return infoDictionary[kRTCAppGroupIdentifier];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
- (NSString *)filePathForApplicationGroupIdentifier:(nonnull NSString *)identifier {
|
|
74
|
+
NSURL *sharedContainer =
|
|
75
|
+
[[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:identifier];
|
|
76
|
+
NSString *socketFilePath = [[sharedContainer URLByAppendingPathComponent:kRTCScreensharingSocketFD] path];
|
|
77
|
+
|
|
78
|
+
return socketFilePath;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
@end
|
|
82
|
+
|
|
83
|
+
#endif
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#if TARGET_OS_IOS
|
|
2
|
+
|
|
3
|
+
#import <React/RCTUIManager.h>
|
|
4
|
+
#import <ReplayKit/ReplayKit.h>
|
|
5
|
+
|
|
6
|
+
#import "ScreenCapturePickerViewManager.h"
|
|
7
|
+
|
|
8
|
+
NSString *const kRTCScreenSharingExtension = @"RTCScreenSharingExtension";
|
|
9
|
+
|
|
10
|
+
@implementation ScreenCapturePickerViewManager {
|
|
11
|
+
RPSystemBroadcastPickerView *_broadcastPickerView;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
RCT_EXPORT_MODULE()
|
|
15
|
+
|
|
16
|
+
- (UIView *)view {
|
|
17
|
+
_broadcastPickerView = [[RPSystemBroadcastPickerView alloc] init];
|
|
18
|
+
_broadcastPickerView.preferredExtension = self.preferredExtension;
|
|
19
|
+
_broadcastPickerView.showsMicrophoneButton = false;
|
|
20
|
+
_broadcastPickerView.userInteractionEnabled = false;
|
|
21
|
+
|
|
22
|
+
return _broadcastPickerView;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// MARK: Private Methods
|
|
26
|
+
|
|
27
|
+
- (NSString *)preferredExtension {
|
|
28
|
+
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
|
|
29
|
+
return infoDictionary[kRTCScreenSharingExtension];
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
RCT_EXPORT_METHOD(show : (nonnull NSNumber *)reactTag) {
|
|
33
|
+
[self.bridge.uiManager
|
|
34
|
+
addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary<NSNumber *, UIView *> *viewRegistry) {
|
|
35
|
+
id view = viewRegistry[reactTag];
|
|
36
|
+
if (![view isKindOfClass:[RPSystemBroadcastPickerView class]]) {
|
|
37
|
+
RCTLogError(@"Invalid view returned from registry, expecting "
|
|
38
|
+
@"RPSystemBroadcastPickerView, got: %@",
|
|
39
|
+
view);
|
|
40
|
+
} else {
|
|
41
|
+
// Simulate a click
|
|
42
|
+
UIButton *btn = nil;
|
|
43
|
+
|
|
44
|
+
for (UIView *subview in ((RPSystemBroadcastPickerView *)view).subviews) {
|
|
45
|
+
if ([subview isKindOfClass:[UIButton class]]) {
|
|
46
|
+
btn = (UIButton *)subview;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (btn != nil) {
|
|
50
|
+
[btn sendActionsForControlEvents:UIControlEventTouchUpInside];
|
|
51
|
+
} else {
|
|
52
|
+
RCTLogError(@"RPSystemBroadcastPickerView button not found");
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}];
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@end
|
|
59
|
+
|
|
60
|
+
#endif
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
#import <AVFoundation/AVFoundation.h>
|
|
2
|
+
#import <WebRTC/RTCVideoCapturer.h>
|
|
3
|
+
#import "CapturerEventsDelegate.h"
|
|
4
|
+
|
|
5
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
6
|
+
|
|
7
|
+
@class SocketConnection;
|
|
8
|
+
|
|
9
|
+
@interface ScreenCapturer : RTCVideoCapturer
|
|
10
|
+
|
|
11
|
+
@property(nonatomic, weak) id<CapturerEventsDelegate> eventsDelegate;
|
|
12
|
+
|
|
13
|
+
- (instancetype)initWithDelegate:(__weak id<RTCVideoCapturerDelegate>)delegate;
|
|
14
|
+
- (void)startCaptureWithConnection:(nonnull SocketConnection *)connection;
|
|
15
|
+
- (void)stopCapture;
|
|
16
|
+
|
|
17
|
+
@end
|
|
18
|
+
|
|
19
|
+
NS_ASSUME_NONNULL_END
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
#if TARGET_OS_IOS
|
|
2
|
+
|
|
3
|
+
#include <mach/mach_time.h>
|
|
4
|
+
|
|
5
|
+
#import <ReplayKit/ReplayKit.h>
|
|
6
|
+
#import <WebRTC/RTCCVPixelBuffer.h>
|
|
7
|
+
#import <WebRTC/RTCVideoFrameBuffer.h>
|
|
8
|
+
|
|
9
|
+
#import "ScreenCapturer.h"
|
|
10
|
+
#import "SocketConnection.h"
|
|
11
|
+
|
|
12
|
+
const NSUInteger kMaxReadLength = 10 * 1024;
|
|
13
|
+
|
|
14
|
+
@interface Message : NSObject
|
|
15
|
+
|
|
16
|
+
@property(nonatomic, assign, readonly) CVImageBufferRef imageBuffer;
|
|
17
|
+
@property(nonatomic, copy, nullable) void (^didComplete)(BOOL succes, Message *message);
|
|
18
|
+
|
|
19
|
+
- (NSInteger)appendBytes:(UInt8 *)buffer length:(NSUInteger)length;
|
|
20
|
+
|
|
21
|
+
@end
|
|
22
|
+
|
|
23
|
+
@interface Message ()
|
|
24
|
+
|
|
25
|
+
@property(nonatomic, assign) CVImageBufferRef imageBuffer;
|
|
26
|
+
@property(nonatomic, assign) int imageOrientation;
|
|
27
|
+
@property(nonatomic, assign) CFHTTPMessageRef framedMessage;
|
|
28
|
+
|
|
29
|
+
@end
|
|
30
|
+
|
|
31
|
+
@implementation Message
|
|
32
|
+
|
|
33
|
+
- (instancetype)init {
|
|
34
|
+
self = [super init];
|
|
35
|
+
if (self) {
|
|
36
|
+
self.imageBuffer = NULL;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
return self;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
- (void)dealloc {
|
|
43
|
+
CVPixelBufferRelease(_imageBuffer);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Returns the amount of missing bytes to complete the message, or -1 when not enough bytes were provided to compute
|
|
47
|
+
* the message length */
|
|
48
|
+
- (NSInteger)appendBytes:(UInt8 *)buffer length:(NSUInteger)length {
|
|
49
|
+
if (!_framedMessage) {
|
|
50
|
+
_framedMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, false);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
CFHTTPMessageAppendBytes(_framedMessage, buffer, length);
|
|
54
|
+
if (!CFHTTPMessageIsHeaderComplete(_framedMessage)) {
|
|
55
|
+
return -1;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
NSInteger contentLength =
|
|
59
|
+
[CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(_framedMessage, (__bridge CFStringRef) @"Content-Length"))
|
|
60
|
+
integerValue];
|
|
61
|
+
NSInteger bodyLength = (NSInteger)[CFBridgingRelease(CFHTTPMessageCopyBody(_framedMessage)) length];
|
|
62
|
+
|
|
63
|
+
NSInteger missingBytesCount = contentLength - bodyLength;
|
|
64
|
+
if (missingBytesCount == 0) {
|
|
65
|
+
BOOL success = [self unwrapMessage:self.framedMessage];
|
|
66
|
+
self.didComplete(success, self);
|
|
67
|
+
|
|
68
|
+
CFRelease(self.framedMessage);
|
|
69
|
+
self.framedMessage = NULL;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return missingBytesCount;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// MARK: Private Methods
|
|
76
|
+
|
|
77
|
+
- (CIContext *)imageContext {
|
|
78
|
+
// Initializing a CIContext object is costly, so we use a singleton instead
|
|
79
|
+
static CIContext *imageContext = nil;
|
|
80
|
+
static dispatch_once_t onceToken;
|
|
81
|
+
dispatch_once(&onceToken, ^{
|
|
82
|
+
imageContext = [[CIContext alloc] initWithOptions:nil];
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
return imageContext;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
- (BOOL)unwrapMessage:(CFHTTPMessageRef)framedMessage {
|
|
89
|
+
size_t width =
|
|
90
|
+
[CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(_framedMessage, (__bridge CFStringRef) @"Buffer-Width"))
|
|
91
|
+
integerValue];
|
|
92
|
+
size_t height =
|
|
93
|
+
[CFBridgingRelease(CFHTTPMessageCopyHeaderFieldValue(_framedMessage, (__bridge CFStringRef) @"Buffer-Height"))
|
|
94
|
+
integerValue];
|
|
95
|
+
_imageOrientation = [CFBridgingRelease(
|
|
96
|
+
CFHTTPMessageCopyHeaderFieldValue(_framedMessage, (__bridge CFStringRef) @"Buffer-Orientation")) intValue];
|
|
97
|
+
|
|
98
|
+
NSData *messageData = CFBridgingRelease(CFHTTPMessageCopyBody(_framedMessage));
|
|
99
|
+
|
|
100
|
+
// Copy the pixel buffer
|
|
101
|
+
CVReturn status =
|
|
102
|
+
CVPixelBufferCreate(kCFAllocatorDefault, width, height, kCVPixelFormatType_32BGRA, NULL, &_imageBuffer);
|
|
103
|
+
if (status != kCVReturnSuccess) {
|
|
104
|
+
NSLog(@"CVPixelBufferCreate failed");
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
[self copyImageData:messageData toPixelBuffer:&_imageBuffer];
|
|
109
|
+
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
- (void)copyImageData:(NSData *)data toPixelBuffer:(CVPixelBufferRef *)pixelBuffer {
|
|
114
|
+
CVPixelBufferLockBaseAddress(*pixelBuffer, 0);
|
|
115
|
+
|
|
116
|
+
CIImage *image = [CIImage imageWithData:data];
|
|
117
|
+
[self.imageContext render:image toCVPixelBuffer:*pixelBuffer];
|
|
118
|
+
|
|
119
|
+
CVPixelBufferUnlockBaseAddress(*pixelBuffer, 0);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
@end
|
|
123
|
+
|
|
124
|
+
// MARK: -
|
|
125
|
+
|
|
126
|
+
@interface ScreenCapturer ()<NSStreamDelegate>
|
|
127
|
+
|
|
128
|
+
@property(nonatomic, strong) SocketConnection *connection;
|
|
129
|
+
@property(nonatomic, strong) Message *message;
|
|
130
|
+
|
|
131
|
+
@end
|
|
132
|
+
|
|
133
|
+
@implementation ScreenCapturer {
|
|
134
|
+
mach_timebase_info_data_t _timebaseInfo;
|
|
135
|
+
NSInteger _readLength;
|
|
136
|
+
int64_t _startTimeStampNs;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
- (instancetype)initWithDelegate:(__weak id<RTCVideoCapturerDelegate>)delegate {
|
|
140
|
+
self = [super initWithDelegate:delegate];
|
|
141
|
+
if (self) {
|
|
142
|
+
mach_timebase_info(&_timebaseInfo);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
return self;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
- (void)setConnection:(SocketConnection *)connection {
|
|
149
|
+
if (_connection != connection) {
|
|
150
|
+
[_connection close];
|
|
151
|
+
_connection = connection;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
- (void)startCaptureWithConnection:(SocketConnection *)connection {
|
|
156
|
+
_startTimeStampNs = -1;
|
|
157
|
+
|
|
158
|
+
self.connection = connection;
|
|
159
|
+
self.message = nil;
|
|
160
|
+
|
|
161
|
+
[self.connection openWithStreamDelegate:self];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
- (void)stopCapture {
|
|
165
|
+
self.connection = nil;
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// MARK: Private Methods
|
|
169
|
+
|
|
170
|
+
- (void)readBytesFromStream:(NSInputStream *)stream {
|
|
171
|
+
if (!stream.hasBytesAvailable) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (!self.message) {
|
|
176
|
+
self.message = [[Message alloc] init];
|
|
177
|
+
_readLength = kMaxReadLength;
|
|
178
|
+
|
|
179
|
+
__weak __typeof__(self) weakSelf = self;
|
|
180
|
+
self.message.didComplete = ^(BOOL success, Message *message) {
|
|
181
|
+
if (success) {
|
|
182
|
+
[weakSelf didCaptureVideoFrame:message.imageBuffer withOrientation:message.imageOrientation];
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
weakSelf.message = nil;
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
uint8_t buffer[_readLength];
|
|
190
|
+
NSInteger numberOfBytesRead = [stream read:buffer maxLength:_readLength];
|
|
191
|
+
if (numberOfBytesRead < 0) {
|
|
192
|
+
NSLog(@"error reading bytes from stream");
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
_readLength = [self.message appendBytes:buffer length:numberOfBytesRead];
|
|
197
|
+
if (_readLength == -1 || _readLength > kMaxReadLength) {
|
|
198
|
+
_readLength = kMaxReadLength;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
- (void)didCaptureVideoFrame:(CVPixelBufferRef)pixelBuffer withOrientation:(CGImagePropertyOrientation)orientation {
|
|
203
|
+
int64_t currentTime = mach_absolute_time();
|
|
204
|
+
int64_t currentTimeStampNs = currentTime * _timebaseInfo.numer / _timebaseInfo.denom;
|
|
205
|
+
|
|
206
|
+
if (_startTimeStampNs < 0) {
|
|
207
|
+
_startTimeStampNs = currentTimeStampNs;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer];
|
|
211
|
+
int64_t frameTimeStampNs = currentTimeStampNs - _startTimeStampNs;
|
|
212
|
+
|
|
213
|
+
RTCVideoRotation rotation;
|
|
214
|
+
switch (orientation) {
|
|
215
|
+
case kCGImagePropertyOrientationLeft:
|
|
216
|
+
rotation = RTCVideoRotation_90;
|
|
217
|
+
break;
|
|
218
|
+
case kCGImagePropertyOrientationDown:
|
|
219
|
+
rotation = RTCVideoRotation_180;
|
|
220
|
+
break;
|
|
221
|
+
case kCGImagePropertyOrientationRight:
|
|
222
|
+
rotation = RTCVideoRotation_270;
|
|
223
|
+
break;
|
|
224
|
+
default:
|
|
225
|
+
rotation = RTCVideoRotation_0;
|
|
226
|
+
break;
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
RTCVideoFrame *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer
|
|
230
|
+
rotation:rotation
|
|
231
|
+
timeStampNs:frameTimeStampNs];
|
|
232
|
+
|
|
233
|
+
[self.delegate capturer:self didCaptureVideoFrame:videoFrame];
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
@end
|
|
237
|
+
|
|
238
|
+
@implementation ScreenCapturer (NSStreamDelegate)
|
|
239
|
+
|
|
240
|
+
- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
|
|
241
|
+
switch (eventCode) {
|
|
242
|
+
case NSStreamEventOpenCompleted:
|
|
243
|
+
NSLog(@"server stream open completed");
|
|
244
|
+
break;
|
|
245
|
+
case NSStreamEventHasBytesAvailable:
|
|
246
|
+
[self readBytesFromStream:(NSInputStream *)aStream];
|
|
247
|
+
break;
|
|
248
|
+
case NSStreamEventEndEncountered:
|
|
249
|
+
NSLog(@"server stream end encountered");
|
|
250
|
+
[self stopCapture];
|
|
251
|
+
[self.eventsDelegate capturerDidEnd:self];
|
|
252
|
+
break;
|
|
253
|
+
case NSStreamEventErrorOccurred:
|
|
254
|
+
NSLog(@"server stream error encountered: %@", aStream.streamError.localizedDescription);
|
|
255
|
+
break;
|
|
256
|
+
|
|
257
|
+
default:
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
@end
|
|
263
|
+
|
|
264
|
+
#endif
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#import <WebRTC/RTCMediaStreamTrack.h>
|
|
2
|
+
#import <WebRTC/RTCPeerConnectionFactory.h>
|
|
3
|
+
#import <WebRTC/RTCRtpReceiver.h>
|
|
4
|
+
#import <WebRTC/RTCRtpTransceiver.h>
|
|
5
|
+
#import <WebRTC/RTCVideoCodecInfo.h>
|
|
6
|
+
#import "WebRTCModule+RTCPeerConnection.h"
|
|
7
|
+
|
|
8
|
+
@interface SerializeUtils : NSObject
|
|
9
|
+
|
|
10
|
+
+ (NSString *_Nonnull)transceiverToJSONWithPeerConnectionId:(nonnull NSNumber *)id
|
|
11
|
+
transceiver:(RTCRtpTransceiver *_Nonnull)transceiver;
|
|
12
|
+
+ (NSDictionary *_Nonnull)senderToJSONWithPeerConnectionId:(nonnull NSNumber *)id sender:(RTCRtpSender *_Nonnull)sender;
|
|
13
|
+
+ (NSDictionary *_Nonnull)receiverToJSONWithPeerConnectionId:(nonnull NSNumber *)id
|
|
14
|
+
receiver:(RTCRtpReceiver *_Nonnull)receiver;
|
|
15
|
+
+ (NSDictionary *_Nonnull)trackToJSONWithPeerConnectionId:(nonnull NSNumber *)id
|
|
16
|
+
track:(RTCMediaStreamTrack *_Nonnull)track;
|
|
17
|
+
+ (NSDictionary *_Nonnull)capabilitiesToJSON:(RTCRtpCapabilities *_Nonnull)capabilities;
|
|
18
|
+
+ (NSDictionary *_Nonnull)codecCapabilityToJSON:(RTCRtpCodecCapability *_Nonnull)codec;
|
|
19
|
+
+ (NSString *_Nonnull)serializeDirection:(RTCRtpTransceiverDirection)direction;
|
|
20
|
+
+ (RTCRtpTransceiverDirection)parseDirection:(NSString *_Nonnull)direction;
|
|
21
|
+
+ (RTCRtpTransceiverInit *_Nonnull)parseTransceiverOptions:(NSDictionary *_Nonnull)parameters;
|
|
22
|
+
+ (NSDictionary *_Nonnull)parametersToJSON:(RTCRtpParameters *_Nonnull)parameters;
|
|
23
|
+
+ (NSMutableArray *_Nonnull)constructTransceiversInfoArrayWithPeerConnection:
|
|
24
|
+
(RTCPeerConnection *_Nonnull)peerConnection;
|
|
25
|
+
+ (NSDictionary *_Nonnull)streamToJSONWithPeerConnectionId:(NSNumber *_Nonnull)id
|
|
26
|
+
stream:(RTCMediaStream *_Nonnull)stream
|
|
27
|
+
streamReactTag:(NSString *_Nonnull)streamReactTag;
|
|
28
|
+
@end
|