@sbhjt-gr/react-native-webrtc 124.0.3 → 124.0.4
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 -11
- package/.eslintignore +6 -6
- package/.nvmrc +1 -1
- package/ISSUE_TEMPLATE.md +40 -40
- package/LICENSE +22 -22
- package/README.md +103 -103
- package/android/build.gradle +37 -37
- package/android/consumer-rules.pro +3 -3
- package/android/src/main/AndroidManifest.xml +11 -11
- package/android/src/main/java/com/oney/WebRTCModule/AbstractVideoCaptureController.java +113 -113
- package/android/src/main/java/com/oney/WebRTCModule/CameraCaptureController.java +338 -338
- package/android/src/main/java/com/oney/WebRTCModule/CameraEventsHandler.java +49 -49
- package/android/src/main/java/com/oney/WebRTCModule/DataChannelWrapper.java +99 -99
- package/android/src/main/java/com/oney/WebRTCModule/DataPacketCryptorManager.java +62 -62
- package/android/src/main/java/com/oney/WebRTCModule/DisplayUtils.java +16 -16
- package/android/src/main/java/com/oney/WebRTCModule/EglUtils.java +66 -66
- package/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java +539 -539
- package/android/src/main/java/com/oney/WebRTCModule/LibraryLoader.java +21 -21
- package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionNotification.java +70 -70
- package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionService.java +82 -82
- package/android/src/main/java/com/oney/WebRTCModule/PeerConnectionObserver.java +588 -588
- package/android/src/main/java/com/oney/WebRTCModule/RTCCryptoManager.java +493 -493
- package/android/src/main/java/com/oney/WebRTCModule/RTCVideoViewManager.java +98 -98
- package/android/src/main/java/com/oney/WebRTCModule/ReactBridgeUtil.java +35 -35
- package/android/src/main/java/com/oney/WebRTCModule/ScreenCaptureController.java +94 -94
- package/android/src/main/java/com/oney/WebRTCModule/SerializeUtils.java +342 -342
- package/android/src/main/java/com/oney/WebRTCModule/StringUtils.java +100 -100
- package/android/src/main/java/com/oney/WebRTCModule/ThreadUtils.java +41 -41
- package/android/src/main/java/com/oney/WebRTCModule/TrackCapturerEventsEmitter.java +34 -34
- package/android/src/main/java/com/oney/WebRTCModule/VideoTrackAdapter.java +137 -137
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java +1649 -1643
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModuleOptions.java +33 -33
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModulePackage.java +21 -21
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCView.java +583 -583
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraClient.java +529 -501
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraConfig.java +17 -17
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraListener.java +7 -7
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/ProcessorProvider.java +38 -38
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoEffectProcessor.java +59 -59
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessor.java +19 -19
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessorFactoryInterface.java +12 -12
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoDecoderFactory.java +73 -73
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoEncoderFactory.java +73 -73
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoDecoderFactoryProxy.java +36 -36
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoEncoderFactoryProxy.java +36 -36
- package/android/src/main/java/org/webrtc/Camera1Helper.java +54 -54
- package/android/src/main/java/org/webrtc/Camera2Helper.java +52 -52
- package/android/src/main/res/values/strings.xml +5 -5
- package/android/src/main/res/values/styles.xml +8 -8
- package/ios/RCTWebRTC/CaptureController.h +18 -18
- package/ios/RCTWebRTC/CaptureController.m +28 -28
- package/ios/RCTWebRTC/CapturerEventsDelegate.h +12 -12
- package/ios/RCTWebRTC/DataChannelWrapper.h +27 -27
- package/ios/RCTWebRTC/DataChannelWrapper.m +42 -42
- package/ios/RCTWebRTC/I420Converter.h +22 -22
- package/ios/RCTWebRTC/I420Converter.m +164 -164
- package/ios/RCTWebRTC/PIPController.h +24 -24
- package/ios/RCTWebRTC/PIPController.m +234 -234
- package/ios/RCTWebRTC/PalabraAudioSink.h +13 -13
- package/ios/RCTWebRTC/PalabraAudioSink.m +18 -18
- package/ios/RCTWebRTC/PalabraClient.h +42 -36
- package/ios/RCTWebRTC/PalabraClient.m +680 -644
- package/ios/RCTWebRTC/RCTConvert+WebRTC.h +16 -16
- package/ios/RCTWebRTC/RCTConvert+WebRTC.m +206 -206
- package/ios/RCTWebRTC/RTCMediaStreamTrack+React.h +10 -10
- package/ios/RCTWebRTC/RTCMediaStreamTrack+React.m +16 -16
- package/ios/RCTWebRTC/RTCVideoViewManager.h +29 -29
- package/ios/RCTWebRTC/RTCVideoViewManager.m +411 -411
- package/ios/RCTWebRTC/SampleBufferVideoCallView.h +12 -12
- package/ios/RCTWebRTC/SampleBufferVideoCallView.m +178 -178
- package/ios/RCTWebRTC/ScreenCaptureController.h +20 -20
- package/ios/RCTWebRTC/ScreenCaptureController.m +82 -82
- package/ios/RCTWebRTC/ScreenCapturePickerViewManager.h +7 -7
- package/ios/RCTWebRTC/ScreenCapturePickerViewManager.m +59 -59
- package/ios/RCTWebRTC/ScreenCapturer.h +19 -19
- package/ios/RCTWebRTC/ScreenCapturer.m +263 -263
- package/ios/RCTWebRTC/SerializeUtils.h +28 -28
- package/ios/RCTWebRTC/SerializeUtils.m +314 -314
- package/ios/RCTWebRTC/SocketConnection.h +13 -13
- package/ios/RCTWebRTC/SocketConnection.m +137 -137
- package/ios/RCTWebRTC/TrackCapturerEventsEmitter.h +14 -14
- package/ios/RCTWebRTC/TrackCapturerEventsEmitter.m +36 -36
- package/ios/RCTWebRTC/VideoCaptureController.h +21 -21
- package/ios/RCTWebRTC/VideoCaptureController.m +328 -328
- package/ios/RCTWebRTC/WLVAudioDevice.h +12 -12
- package/ios/RCTWebRTC/WLVAudioDevice.m +137 -137
- package/ios/RCTWebRTC/WebRTCModule+Palabra.h +4 -4
- package/ios/RCTWebRTC/WebRTCModule+Palabra.m +92 -83
- package/ios/RCTWebRTC/WebRTCModule+Permissions.m +75 -75
- package/ios/RCTWebRTC/WebRTCModule+RTCAudioSession.m +20 -20
- package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.h +14 -14
- package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.m +165 -165
- package/ios/RCTWebRTC/WebRTCModule+RTCFrameCryptor.m +611 -611
- package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.h +13 -13
- package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m +728 -728
- package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.h +24 -24
- package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m +1004 -1004
- package/ios/RCTWebRTC/WebRTCModule+Transceivers.m +267 -267
- package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.h +12 -12
- package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.m +166 -166
- package/ios/RCTWebRTC/WebRTCModule.h +58 -58
- package/ios/RCTWebRTC/WebRTCModule.m +169 -169
- package/ios/RCTWebRTC/WebRTCModuleOptions.h +24 -24
- package/ios/RCTWebRTC/WebRTCModuleOptions.m +31 -31
- package/ios/RCTWebRTC/videoEffects/ProcessorProvider.h +9 -9
- package/ios/RCTWebRTC/videoEffects/ProcessorProvider.m +23 -23
- package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.h +13 -13
- package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.m +23 -23
- package/ios/RCTWebRTC/videoEffects/VideoFrameProcessor.h +8 -8
- package/ios/RCTWebRTC.xcodeproj/project.pbxproj +404 -404
- package/ios/RCTWebRTC.xcworkspace/contents.xcworkspacedata +10 -10
- package/lib/commonjs/Constraints.js.map +1 -1
- package/lib/commonjs/EventEmitter.js.map +1 -1
- package/lib/commonjs/Logger.js.map +1 -1
- package/lib/commonjs/MediaDevices.js +17 -17
- package/lib/commonjs/MediaDevices.js.map +1 -1
- package/lib/commonjs/MediaStream.js +19 -19
- package/lib/commonjs/MediaStream.js.map +1 -1
- package/lib/commonjs/MediaStreamError.js.map +1 -1
- package/lib/commonjs/MediaStreamErrorEvent.js.map +1 -1
- package/lib/commonjs/MediaStreamTrack.js +28 -28
- package/lib/commonjs/MediaStreamTrack.js.map +1 -1
- package/lib/commonjs/MediaStreamTrackEvent.js +6 -6
- package/lib/commonjs/MediaStreamTrackEvent.js.map +1 -1
- package/lib/commonjs/MessageEvent.js +7 -7
- package/lib/commonjs/MessageEvent.js.map +1 -1
- package/lib/commonjs/Permissions.js +28 -28
- package/lib/commonjs/Permissions.js.map +1 -1
- package/lib/commonjs/RTCAudioSession.js +4 -4
- package/lib/commonjs/RTCAudioSession.js.map +1 -1
- package/lib/commonjs/RTCDataChannel.js +2 -2
- package/lib/commonjs/RTCDataChannel.js.map +1 -1
- package/lib/commonjs/RTCDataChannelEvent.js +6 -6
- package/lib/commonjs/RTCDataChannelEvent.js.map +1 -1
- package/lib/commonjs/RTCDataPacketCryptor.js.map +1 -1
- package/lib/commonjs/RTCDataPacketCryptorFactory.js.map +1 -1
- package/lib/commonjs/RTCErrorEvent.js +3 -3
- package/lib/commonjs/RTCErrorEvent.js.map +1 -1
- package/lib/commonjs/RTCFrameCryptor.js +8 -8
- package/lib/commonjs/RTCFrameCryptor.js.map +1 -1
- package/lib/commonjs/RTCFrameCryptorFactory.js.map +1 -1
- package/lib/commonjs/RTCIceCandidate.js.map +1 -1
- package/lib/commonjs/RTCIceCandidateEvent.js +7 -7
- package/lib/commonjs/RTCIceCandidateEvent.js.map +1 -1
- package/lib/commonjs/RTCKeyProvider.js.map +1 -1
- package/lib/commonjs/RTCPIPView.js +2 -2
- package/lib/commonjs/RTCPIPView.js.map +1 -1
- package/lib/commonjs/RTCPIPView.web.js.map +1 -1
- package/lib/commonjs/RTCPeerConnection.js +36 -36
- package/lib/commonjs/RTCPeerConnection.js.map +1 -1
- package/lib/commonjs/RTCRtcpParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpCapabilities.js +2 -2
- package/lib/commonjs/RTCRtpCapabilities.js.map +1 -1
- package/lib/commonjs/RTCRtpCodecCapability.js.map +1 -1
- package/lib/commonjs/RTCRtpCodecParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpEncodingParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpHeaderExtension.js.map +1 -1
- package/lib/commonjs/RTCRtpParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpReceiveParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpReceiver.js +7 -7
- package/lib/commonjs/RTCRtpReceiver.js.map +1 -1
- package/lib/commonjs/RTCRtpSendParameters.js +3 -3
- package/lib/commonjs/RTCRtpSendParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpSender.js +7 -7
- package/lib/commonjs/RTCRtpSender.js.map +1 -1
- package/lib/commonjs/RTCRtpTransceiver.js.map +1 -1
- package/lib/commonjs/RTCSessionDescription.js.map +1 -1
- package/lib/commonjs/RTCTrackEvent.js +6 -6
- package/lib/commonjs/RTCTrackEvent.js.map +1 -1
- package/lib/commonjs/RTCUtil.js +28 -28
- package/lib/commonjs/RTCUtil.js.map +1 -1
- package/lib/commonjs/RTCView.js +5 -5
- package/lib/commonjs/RTCView.js.map +1 -1
- package/lib/commonjs/RTCView.web.js.map +1 -1
- package/lib/commonjs/ScreenCapturePickerView.js.map +1 -1
- package/lib/commonjs/ScreenCapturePickerView.web.js.map +1 -1
- package/lib/commonjs/getDisplayMedia.js.map +1 -1
- package/lib/commonjs/getUserMedia.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/webStream.js.map +1 -1
- package/lib/module/Constraints.js.map +1 -1
- package/lib/module/EventEmitter.js.map +1 -1
- package/lib/module/Logger.js.map +1 -1
- package/lib/module/MediaDevices.js +17 -17
- package/lib/module/MediaDevices.js.map +1 -1
- package/lib/module/MediaStream.js +19 -19
- package/lib/module/MediaStream.js.map +1 -1
- package/lib/module/MediaStreamError.js.map +1 -1
- package/lib/module/MediaStreamErrorEvent.js.map +1 -1
- package/lib/module/MediaStreamTrack.js +28 -28
- package/lib/module/MediaStreamTrack.js.map +1 -1
- package/lib/module/MediaStreamTrackEvent.js +6 -6
- package/lib/module/MediaStreamTrackEvent.js.map +1 -1
- package/lib/module/MessageEvent.js +7 -7
- package/lib/module/MessageEvent.js.map +1 -1
- package/lib/module/Permissions.js +28 -28
- package/lib/module/Permissions.js.map +1 -1
- package/lib/module/RTCAudioSession.js +4 -4
- package/lib/module/RTCAudioSession.js.map +1 -1
- package/lib/module/RTCDataChannel.js +2 -2
- package/lib/module/RTCDataChannel.js.map +1 -1
- package/lib/module/RTCDataChannelEvent.js +6 -6
- package/lib/module/RTCDataChannelEvent.js.map +1 -1
- package/lib/module/RTCDataPacketCryptor.js.map +1 -1
- package/lib/module/RTCDataPacketCryptorFactory.js.map +1 -1
- package/lib/module/RTCErrorEvent.js +3 -3
- package/lib/module/RTCErrorEvent.js.map +1 -1
- package/lib/module/RTCFrameCryptor.js +8 -8
- package/lib/module/RTCFrameCryptor.js.map +1 -1
- package/lib/module/RTCFrameCryptorFactory.js.map +1 -1
- package/lib/module/RTCIceCandidate.js.map +1 -1
- package/lib/module/RTCIceCandidateEvent.js +7 -7
- package/lib/module/RTCIceCandidateEvent.js.map +1 -1
- package/lib/module/RTCKeyProvider.js.map +1 -1
- package/lib/module/RTCPIPView.js +2 -2
- package/lib/module/RTCPIPView.js.map +1 -1
- package/lib/module/RTCPIPView.web.js.map +1 -1
- package/lib/module/RTCPeerConnection.js +36 -36
- package/lib/module/RTCPeerConnection.js.map +1 -1
- package/lib/module/RTCRtcpParameters.js.map +1 -1
- package/lib/module/RTCRtpCapabilities.js +2 -2
- package/lib/module/RTCRtpCapabilities.js.map +1 -1
- package/lib/module/RTCRtpCodecCapability.js.map +1 -1
- package/lib/module/RTCRtpCodecParameters.js.map +1 -1
- package/lib/module/RTCRtpEncodingParameters.js.map +1 -1
- package/lib/module/RTCRtpHeaderExtension.js.map +1 -1
- package/lib/module/RTCRtpParameters.js.map +1 -1
- package/lib/module/RTCRtpReceiveParameters.js.map +1 -1
- package/lib/module/RTCRtpReceiver.js +7 -7
- package/lib/module/RTCRtpReceiver.js.map +1 -1
- package/lib/module/RTCRtpSendParameters.js +3 -3
- package/lib/module/RTCRtpSendParameters.js.map +1 -1
- package/lib/module/RTCRtpSender.js +7 -7
- package/lib/module/RTCRtpSender.js.map +1 -1
- package/lib/module/RTCRtpTransceiver.js.map +1 -1
- package/lib/module/RTCSessionDescription.js.map +1 -1
- package/lib/module/RTCTrackEvent.js +6 -6
- package/lib/module/RTCTrackEvent.js.map +1 -1
- package/lib/module/RTCUtil.js +28 -28
- package/lib/module/RTCUtil.js.map +1 -1
- package/lib/module/RTCView.js +5 -5
- package/lib/module/RTCView.js.map +1 -1
- package/lib/module/RTCView.web.js.map +1 -1
- package/lib/module/ScreenCapturePickerView.js.map +1 -1
- package/lib/module/ScreenCapturePickerView.web.js.map +1 -1
- package/lib/module/getDisplayMedia.js.map +1 -1
- package/lib/module/getUserMedia.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/webStream.js.map +1 -1
- package/lib/typescript/Constraints.d.ts +19 -19
- package/lib/typescript/EventEmitter.d.ts +6 -6
- package/lib/typescript/Logger.d.ts +13 -13
- package/lib/typescript/MediaDevices.d.ts +30 -30
- package/lib/typescript/MediaStream.d.ts +48 -48
- package/lib/typescript/MediaStreamError.d.ts +6 -6
- package/lib/typescript/MediaStreamErrorEvent.d.ts +6 -6
- package/lib/typescript/MediaStreamTrack.d.ts +101 -101
- package/lib/typescript/MediaStreamTrackEvent.d.ts +19 -19
- package/lib/typescript/MessageEvent.d.ts +20 -20
- package/lib/typescript/Permissions.d.ts +55 -55
- package/lib/typescript/RTCAudioSession.d.ts +10 -10
- package/lib/typescript/RTCDataChannel.d.ts +43 -43
- package/lib/typescript/RTCDataChannelEvent.d.ts +19 -19
- package/lib/typescript/RTCDataPacketCryptor.d.ts +12 -12
- package/lib/typescript/RTCDataPacketCryptorFactory.d.ts +6 -6
- package/lib/typescript/RTCErrorEvent.d.ts +12 -12
- package/lib/typescript/RTCFrameCryptor.d.ts +47 -47
- package/lib/typescript/RTCFrameCryptorFactory.d.ts +21 -21
- package/lib/typescript/RTCIceCandidate.d.ts +17 -17
- package/lib/typescript/RTCIceCandidateEvent.d.ts +20 -20
- package/lib/typescript/RTCKeyProvider.d.ts +21 -21
- package/lib/typescript/RTCPIPView.d.ts +15 -15
- package/lib/typescript/RTCPIPView.web.d.ts +13 -13
- package/lib/typescript/RTCPeerConnection.d.ts +117 -117
- package/lib/typescript/RTCRtcpParameters.d.ts +10 -10
- package/lib/typescript/RTCRtpCapabilities.d.ts +9 -9
- package/lib/typescript/RTCRtpCodecCapability.d.ts +7 -7
- package/lib/typescript/RTCRtpCodecParameters.d.ts +16 -16
- package/lib/typescript/RTCRtpEncodingParameters.d.ts +23 -23
- package/lib/typescript/RTCRtpHeaderExtension.d.ts +12 -12
- package/lib/typescript/RTCRtpParameters.d.ts +19 -19
- package/lib/typescript/RTCRtpReceiveParameters.d.ts +4 -4
- package/lib/typescript/RTCRtpReceiver.d.ts +21 -21
- package/lib/typescript/RTCRtpSendParameters.d.ts +20 -20
- package/lib/typescript/RTCRtpSender.d.ts +22 -22
- package/lib/typescript/RTCRtpTransceiver.d.ts +31 -31
- package/lib/typescript/RTCSessionDescription.d.ts +12 -12
- package/lib/typescript/RTCTrackEvent.d.ts +29 -29
- package/lib/typescript/RTCUtil.d.ts +37 -37
- package/lib/typescript/RTCView.d.ts +117 -117
- package/lib/typescript/RTCView.web.d.ts +25 -25
- package/lib/typescript/ScreenCapturePickerView.d.ts +2 -2
- package/lib/typescript/ScreenCapturePickerView.web.d.ts +1 -1
- package/lib/typescript/getDisplayMedia.d.ts +2 -2
- package/lib/typescript/getUserMedia.d.ts +7 -7
- package/lib/typescript/index.d.ts +22 -22
- package/lib/typescript/index.web.d.ts +101 -101
- package/lib/typescript/webStream.d.ts +3 -3
- package/livekit-react-native-webrtc.podspec +29 -29
- package/macos/RCTWebRTC.xcodeproj/project.pbxproj +324 -324
- package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -7
- package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -8
- package/metro.config.js +7 -7
- package/metro.config.macos.js +14 -14
- package/package.json +66 -66
- package/react-native.config.js +11 -11
- package/src/.eslintrc.cjs +67 -67
- package/src/Constraints.ts +20 -20
- package/src/EventEmitter.ts +65 -65
- package/src/Logger.ts +49 -49
- package/src/MediaDevices.ts +53 -53
- package/src/MediaStream.ts +161 -161
- package/src/MediaStreamError.ts +12 -12
- package/src/MediaStreamErrorEvent.ts +11 -11
- package/src/MediaStreamTrack.ts +282 -282
- package/src/MediaStreamTrackEvent.ts +25 -25
- package/src/MessageEvent.ts +26 -26
- package/src/Permissions.ts +133 -133
- package/src/RTCAudioSession.ts +25 -25
- package/src/RTCDataChannel.ts +190 -190
- package/src/RTCDataChannelEvent.ts +28 -28
- package/src/RTCDataPacketCryptor.ts +90 -90
- package/src/RTCDataPacketCryptorFactory.ts +24 -24
- package/src/RTCErrorEvent.ts +20 -20
- package/src/RTCFrameCryptor.ts +162 -162
- package/src/RTCFrameCryptorFactory.ts +101 -101
- package/src/RTCIceCandidate.ts +29 -29
- package/src/RTCIceCandidateEvent.ts +26 -26
- package/src/RTCKeyProvider.ts +117 -117
- package/src/RTCPIPView.tsx +46 -46
- package/src/RTCPIPView.web.tsx +18 -18
- package/src/RTCPeerConnection.ts +935 -935
- package/src/RTCRtcpParameters.ts +23 -23
- package/src/RTCRtpCapabilities.ts +16 -16
- package/src/RTCRtpCodecCapability.ts +12 -12
- package/src/RTCRtpCodecParameters.ts +44 -44
- package/src/RTCRtpEncodingParameters.ts +90 -90
- package/src/RTCRtpHeaderExtension.ts +27 -27
- package/src/RTCRtpParameters.ts +37 -37
- package/src/RTCRtpReceiveParameters.ts +7 -7
- package/src/RTCRtpReceiver.ts +60 -60
- package/src/RTCRtpSendParameters.ts +63 -63
- package/src/RTCRtpSender.ts +78 -78
- package/src/RTCRtpTransceiver.ts +107 -107
- package/src/RTCSessionDescription.ts +30 -30
- package/src/RTCTrackEvent.ts +42 -42
- package/src/RTCUtil.ts +211 -211
- package/src/RTCView.ts +122 -122
- package/src/RTCView.web.tsx +80 -80
- package/src/ScreenCapturePickerView.ts +4 -4
- package/src/ScreenCapturePickerView.web.tsx +3 -3
- package/src/getDisplayMedia.ts +30 -30
- package/src/getUserMedia.ts +136 -136
- package/src/index.ts +107 -107
- package/src/index.web.ts +191 -191
- package/src/webStream.ts +31 -31
- package/tools/format.sh +6 -6
- package/tools/release.sh +45 -45
- package/tsconfig.json +17 -17
|
@@ -1,328 +1,328 @@
|
|
|
1
|
-
#if !TARGET_OS_TV
|
|
2
|
-
|
|
3
|
-
#import "VideoCaptureController.h"
|
|
4
|
-
|
|
5
|
-
#import <React/RCTLog.h>
|
|
6
|
-
|
|
7
|
-
@interface VideoCaptureController ()
|
|
8
|
-
|
|
9
|
-
@property(nonatomic, strong) RTCCameraVideoCapturer *capturer;
|
|
10
|
-
@property(nonatomic, strong) AVCaptureDeviceFormat *selectedFormat;
|
|
11
|
-
@property(nonatomic, strong) AVCaptureDevice *device;
|
|
12
|
-
@property(nonatomic, assign) BOOL running;
|
|
13
|
-
@property(nonatomic, assign) BOOL usingFrontCamera;
|
|
14
|
-
@property(nonatomic, assign) int width;
|
|
15
|
-
@property(nonatomic, assign) int height;
|
|
16
|
-
@property(nonatomic, assign) int frameRate;
|
|
17
|
-
|
|
18
|
-
@end
|
|
19
|
-
|
|
20
|
-
@implementation VideoCaptureController
|
|
21
|
-
|
|
22
|
-
- (instancetype)initWithCapturer:(RTCCameraVideoCapturer *)capturer andConstraints:(NSDictionary *)constraints {
|
|
23
|
-
self = [super init];
|
|
24
|
-
if (self) {
|
|
25
|
-
self.capturer = capturer;
|
|
26
|
-
self.running = NO;
|
|
27
|
-
[self determineDevice:constraints];
|
|
28
|
-
[self applyConstraints:constraints error:nil];
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
return self;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
- (void)dealloc {
|
|
35
|
-
self.device = NULL;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
- (void)startCapture {
|
|
39
|
-
if (self.deviceId) {
|
|
40
|
-
self.device = [AVCaptureDevice deviceWithUniqueID:self.deviceId];
|
|
41
|
-
}
|
|
42
|
-
if (!self.device) {
|
|
43
|
-
AVCaptureDevicePosition position =
|
|
44
|
-
self.usingFrontCamera ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;
|
|
45
|
-
self.device = [self findDeviceForPosition:position];
|
|
46
|
-
self.deviceId = self.device.uniqueID;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
if (!self.device) {
|
|
50
|
-
RCTLogWarn(@"[VideoCaptureController] No capture devices found!");
|
|
51
|
-
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
AVCaptureDeviceFormat *format = [self selectFormatForDevice:self.device
|
|
56
|
-
withTargetWidth:self.width
|
|
57
|
-
withTargetHeight:self.height];
|
|
58
|
-
if (!format) {
|
|
59
|
-
RCTLogWarn(@"[VideoCaptureController] No valid formats for device %@", self.device);
|
|
60
|
-
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
self.selectedFormat = format;
|
|
65
|
-
|
|
66
|
-
AVCaptureSession *session = self.capturer.captureSession;
|
|
67
|
-
if (@available(iOS 16.0, *)) {
|
|
68
|
-
BOOL enable = self.enableMultitaskingCameraAccess;
|
|
69
|
-
BOOL shouldChange = session.multitaskingCameraAccessEnabled != enable;
|
|
70
|
-
BOOL canChange = !enable || (enable && session.isMultitaskingCameraAccessSupported);
|
|
71
|
-
|
|
72
|
-
if (shouldChange && canChange) {
|
|
73
|
-
[session beginConfiguration];
|
|
74
|
-
[session setMultitaskingCameraAccessEnabled:enable];
|
|
75
|
-
[session commitConfiguration];
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
RCTLog(@"[VideoCaptureController] Capture will start");
|
|
80
|
-
|
|
81
|
-
// Starting the capture happens on another thread. Wait for it.
|
|
82
|
-
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
|
|
83
|
-
|
|
84
|
-
__weak VideoCaptureController *weakSelf = self;
|
|
85
|
-
[self.capturer startCaptureWithDevice:self.device
|
|
86
|
-
format:format
|
|
87
|
-
fps:self.frameRate
|
|
88
|
-
completionHandler:^(NSError *err) {
|
|
89
|
-
if (err) {
|
|
90
|
-
RCTLogError(@"[VideoCaptureController] Error starting capture: %@", err);
|
|
91
|
-
} else {
|
|
92
|
-
RCTLog(@"[VideoCaptureController] Capture started");
|
|
93
|
-
weakSelf.running = YES;
|
|
94
|
-
}
|
|
95
|
-
dispatch_semaphore_signal(semaphore);
|
|
96
|
-
}];
|
|
97
|
-
|
|
98
|
-
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
- (void)stopCapture {
|
|
102
|
-
if (!self.running)
|
|
103
|
-
return;
|
|
104
|
-
|
|
105
|
-
RCTLog(@"[VideoCaptureController] Capture will stop");
|
|
106
|
-
// Stopping the capture happens on another thread. Wait for it.
|
|
107
|
-
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
|
|
108
|
-
|
|
109
|
-
__weak VideoCaptureController *weakSelf = self;
|
|
110
|
-
[self.capturer stopCaptureWithCompletionHandler:^{
|
|
111
|
-
RCTLog(@"[VideoCaptureController] Capture stopped");
|
|
112
|
-
weakSelf.running = NO;
|
|
113
|
-
weakSelf.device = nil;
|
|
114
|
-
|
|
115
|
-
dispatch_semaphore_signal(semaphore);
|
|
116
|
-
}];
|
|
117
|
-
|
|
118
|
-
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
- (void)determineDevice:(NSDictionary *)constraints {
|
|
122
|
-
// Clear device to prepare for starting camera with new constraints.
|
|
123
|
-
self.device = nil;
|
|
124
|
-
NSString *deviceId = constraints[@"deviceId"];
|
|
125
|
-
id facingMode = constraints[@"facingMode"];
|
|
126
|
-
|
|
127
|
-
if (!facingMode && !deviceId) {
|
|
128
|
-
// Default to front camera.
|
|
129
|
-
facingMode = @"user";
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
if (facingMode && [facingMode isKindOfClass:[NSString class]]) {
|
|
133
|
-
AVCaptureDevicePosition position;
|
|
134
|
-
if ([facingMode isEqualToString:@"environment"]) {
|
|
135
|
-
position = AVCaptureDevicePositionBack;
|
|
136
|
-
} else if ([facingMode isEqualToString:@"user"]) {
|
|
137
|
-
position = AVCaptureDevicePositionFront;
|
|
138
|
-
} else {
|
|
139
|
-
// If the specified facingMode value is not supported, fall back
|
|
140
|
-
// to the front camera.
|
|
141
|
-
position = AVCaptureDevicePositionFront;
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
BOOL usingFrontCamera = position == AVCaptureDevicePositionFront;
|
|
145
|
-
if (self.usingFrontCamera != usingFrontCamera) {
|
|
146
|
-
self.usingFrontCamera = usingFrontCamera;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
if (!deviceId) {
|
|
151
|
-
AVCaptureDevicePosition position =
|
|
152
|
-
self.usingFrontCamera ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;
|
|
153
|
-
deviceId = [self findDeviceForPosition:position].uniqueID;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (self.deviceId != deviceId && ![self.deviceId isEqualToString:deviceId]) {
|
|
157
|
-
self.deviceId = deviceId;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
- (void)applyConstraints:(NSDictionary *)constraints error:(NSError **)outError {
|
|
162
|
-
BOOL hasChanged = NO;
|
|
163
|
-
|
|
164
|
-
int width = [constraints[@"width"] intValue];
|
|
165
|
-
int height = [constraints[@"height"] intValue];
|
|
166
|
-
int frameRate = [constraints[@"frameRate"] intValue];
|
|
167
|
-
|
|
168
|
-
if (self.width != width) {
|
|
169
|
-
hasChanged = YES;
|
|
170
|
-
self.width = width;
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
if (self.height != height) {
|
|
174
|
-
hasChanged = YES;
|
|
175
|
-
self.height = height;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
if (self.frameRate != frameRate) {
|
|
179
|
-
hasChanged = YES;
|
|
180
|
-
self.frameRate = frameRate;
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
if (self.running && hasChanged) {
|
|
184
|
-
[self stopCapture];
|
|
185
|
-
[self startCapture];
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
- (NSDictionary *)getSettings {
|
|
190
|
-
AVCaptureDeviceFormat *format = self.selectedFormat;
|
|
191
|
-
CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(format.formatDescription);
|
|
192
|
-
NSMutableDictionary *settings = [[NSMutableDictionary alloc] initWithDictionary:@{
|
|
193
|
-
@"groupId" : @"",
|
|
194
|
-
@"height" : @(dimensions.height),
|
|
195
|
-
@"width" : @(dimensions.width),
|
|
196
|
-
@"frameRate" : @(30),
|
|
197
|
-
@"facingMode" : self.usingFrontCamera ? @"user" : @"environment"
|
|
198
|
-
}];
|
|
199
|
-
|
|
200
|
-
if (self.deviceId) {
|
|
201
|
-
settings[@"deviceId"] = self.deviceId;
|
|
202
|
-
}
|
|
203
|
-
return settings;
|
|
204
|
-
}
|
|
205
|
-
#pragma mark NSKeyValueObserving
|
|
206
|
-
|
|
207
|
-
- (void)observeValueForKeyPath:(NSString *)keyPath
|
|
208
|
-
ofObject:(id)object
|
|
209
|
-
change:(NSDictionary<NSKeyValueChangeKey, id> *)change
|
|
210
|
-
context:(void *)context {
|
|
211
|
-
if (@available(iOS 11.1, *)) {
|
|
212
|
-
if ([object isKindOfClass:[AVCaptureDevice class]] && [keyPath isEqualToString:@"systemPressureState"]) {
|
|
213
|
-
AVCaptureDevice *device = (AVCaptureDevice *)object;
|
|
214
|
-
AVCaptureSystemPressureLevel pressureLevel =
|
|
215
|
-
((AVCaptureSystemPressureState *)change[NSKeyValueChangeNewKey]).level;
|
|
216
|
-
if (pressureLevel == AVCaptureSystemPressureLevelSerious ||
|
|
217
|
-
pressureLevel == AVCaptureSystemPressureLevelCritical) {
|
|
218
|
-
RCTLogWarn(
|
|
219
|
-
@"[VideoCaptureController] Reached elevated system pressure level: %@. Throttling frame rate.",
|
|
220
|
-
pressureLevel);
|
|
221
|
-
[self throttleFrameRateForDevice:device];
|
|
222
|
-
} else if (pressureLevel == AVCaptureSystemPressureLevelNominal) {
|
|
223
|
-
RCTLogWarn(@"[VideoCaptureController] Restored normal system pressure level. Resetting frame rate to "
|
|
224
|
-
@"default.");
|
|
225
|
-
[self resetFrameRateForDevice:device];
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
- (void)registerSystemPressureStateObserverForDevice:(AVCaptureDevice *)device {
|
|
232
|
-
if (@available(iOS 11.1, *)) {
|
|
233
|
-
[device addObserver:self forKeyPath:@"systemPressureState" options:NSKeyValueObservingOptionNew context:nil];
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
- (void)removeObserverForDevice:(AVCaptureDevice *)device {
|
|
238
|
-
if (@available(iOS 11.1, *)) {
|
|
239
|
-
[device removeObserver:self forKeyPath:@"systemPressureState"];
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
#pragma mark Private
|
|
244
|
-
|
|
245
|
-
- (void)setDevice:(AVCaptureDevice *)device {
|
|
246
|
-
if (_device) {
|
|
247
|
-
[self removeObserverForDevice:_device];
|
|
248
|
-
}
|
|
249
|
-
if (device) {
|
|
250
|
-
[self registerSystemPressureStateObserverForDevice:device];
|
|
251
|
-
}
|
|
252
|
-
|
|
253
|
-
_device = device;
|
|
254
|
-
}
|
|
255
|
-
|
|
256
|
-
- (AVCaptureDevice *)findDeviceForPosition:(AVCaptureDevicePosition)position {
|
|
257
|
-
NSArray<AVCaptureDevice *> *captureDevices = [RTCCameraVideoCapturer captureDevices];
|
|
258
|
-
for (AVCaptureDevice *device in captureDevices) {
|
|
259
|
-
if (device.position == position) {
|
|
260
|
-
return device;
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
return [captureDevices firstObject];
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
- (AVCaptureDeviceFormat *)selectFormatForDevice:(AVCaptureDevice *)device
|
|
268
|
-
withTargetWidth:(int)targetWidth
|
|
269
|
-
withTargetHeight:(int)targetHeight {
|
|
270
|
-
NSArray<AVCaptureDeviceFormat *> *formats = [RTCCameraVideoCapturer supportedFormatsForDevice:device];
|
|
271
|
-
AVCaptureDeviceFormat *selectedFormat = nil;
|
|
272
|
-
int currentDiff = INT_MAX;
|
|
273
|
-
|
|
274
|
-
for (AVCaptureDeviceFormat *format in formats) {
|
|
275
|
-
// Only use multi cam formats when on multi cam supported devices.
|
|
276
|
-
if (@available(iOS 13.0, macOS 14.0, tvOS 17.0, *)) {
|
|
277
|
-
if (AVCaptureMultiCamSession.multiCamSupported && !format.multiCamSupported) {
|
|
278
|
-
continue;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
|
|
282
|
-
CMVideoDimensions dimension = CMVideoFormatDescriptionGetDimensions(format.formatDescription);
|
|
283
|
-
FourCharCode pixelFormat = CMFormatDescriptionGetMediaSubType(format.formatDescription);
|
|
284
|
-
int diff = abs(targetWidth - dimension.width) + abs(targetHeight - dimension.height);
|
|
285
|
-
if (diff < currentDiff) {
|
|
286
|
-
selectedFormat = format;
|
|
287
|
-
currentDiff = diff;
|
|
288
|
-
} else if (diff == currentDiff && pixelFormat == [_capturer preferredOutputPixelFormat]) {
|
|
289
|
-
selectedFormat = format;
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
return selectedFormat;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
|
-
- (void)throttleFrameRateForDevice:(AVCaptureDevice *)device {
|
|
297
|
-
NSError *error = nil;
|
|
298
|
-
|
|
299
|
-
[device lockForConfiguration:&error];
|
|
300
|
-
if (error) {
|
|
301
|
-
RCTLog(@"[VideoCaptureController] Could not lock device for configuration: %@", error);
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
device.activeVideoMinFrameDuration = CMTimeMake(1, 20);
|
|
306
|
-
device.activeVideoMaxFrameDuration = CMTimeMake(1, 15);
|
|
307
|
-
|
|
308
|
-
[device unlockForConfiguration];
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
- (void)resetFrameRateForDevice:(AVCaptureDevice *)device {
|
|
312
|
-
NSError *error = nil;
|
|
313
|
-
|
|
314
|
-
[device lockForConfiguration:&error];
|
|
315
|
-
if (error) {
|
|
316
|
-
RCTLog(@"[VideoCaptureController] Could not lock device for configuration: %@", error);
|
|
317
|
-
return;
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
device.activeVideoMinFrameDuration = kCMTimeInvalid;
|
|
321
|
-
device.activeVideoMaxFrameDuration = kCMTimeInvalid;
|
|
322
|
-
|
|
323
|
-
[device unlockForConfiguration];
|
|
324
|
-
}
|
|
325
|
-
|
|
326
|
-
@end
|
|
327
|
-
|
|
328
|
-
#endif
|
|
1
|
+
#if !TARGET_OS_TV
|
|
2
|
+
|
|
3
|
+
#import "VideoCaptureController.h"
|
|
4
|
+
|
|
5
|
+
#import <React/RCTLog.h>
|
|
6
|
+
|
|
7
|
+
@interface VideoCaptureController ()
|
|
8
|
+
|
|
9
|
+
@property(nonatomic, strong) RTCCameraVideoCapturer *capturer;
|
|
10
|
+
@property(nonatomic, strong) AVCaptureDeviceFormat *selectedFormat;
|
|
11
|
+
@property(nonatomic, strong) AVCaptureDevice *device;
|
|
12
|
+
@property(nonatomic, assign) BOOL running;
|
|
13
|
+
@property(nonatomic, assign) BOOL usingFrontCamera;
|
|
14
|
+
@property(nonatomic, assign) int width;
|
|
15
|
+
@property(nonatomic, assign) int height;
|
|
16
|
+
@property(nonatomic, assign) int frameRate;
|
|
17
|
+
|
|
18
|
+
@end
|
|
19
|
+
|
|
20
|
+
@implementation VideoCaptureController
|
|
21
|
+
|
|
22
|
+
- (instancetype)initWithCapturer:(RTCCameraVideoCapturer *)capturer andConstraints:(NSDictionary *)constraints {
|
|
23
|
+
self = [super init];
|
|
24
|
+
if (self) {
|
|
25
|
+
self.capturer = capturer;
|
|
26
|
+
self.running = NO;
|
|
27
|
+
[self determineDevice:constraints];
|
|
28
|
+
[self applyConstraints:constraints error:nil];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
return self;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
- (void)dealloc {
|
|
35
|
+
self.device = NULL;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
- (void)startCapture {
|
|
39
|
+
if (self.deviceId) {
|
|
40
|
+
self.device = [AVCaptureDevice deviceWithUniqueID:self.deviceId];
|
|
41
|
+
}
|
|
42
|
+
if (!self.device) {
|
|
43
|
+
AVCaptureDevicePosition position =
|
|
44
|
+
self.usingFrontCamera ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;
|
|
45
|
+
self.device = [self findDeviceForPosition:position];
|
|
46
|
+
self.deviceId = self.device.uniqueID;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
if (!self.device) {
|
|
50
|
+
RCTLogWarn(@"[VideoCaptureController] No capture devices found!");
|
|
51
|
+
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
AVCaptureDeviceFormat *format = [self selectFormatForDevice:self.device
|
|
56
|
+
withTargetWidth:self.width
|
|
57
|
+
withTargetHeight:self.height];
|
|
58
|
+
if (!format) {
|
|
59
|
+
RCTLogWarn(@"[VideoCaptureController] No valid formats for device %@", self.device);
|
|
60
|
+
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
self.selectedFormat = format;
|
|
65
|
+
|
|
66
|
+
AVCaptureSession *session = self.capturer.captureSession;
|
|
67
|
+
if (@available(iOS 16.0, *)) {
|
|
68
|
+
BOOL enable = self.enableMultitaskingCameraAccess;
|
|
69
|
+
BOOL shouldChange = session.multitaskingCameraAccessEnabled != enable;
|
|
70
|
+
BOOL canChange = !enable || (enable && session.isMultitaskingCameraAccessSupported);
|
|
71
|
+
|
|
72
|
+
if (shouldChange && canChange) {
|
|
73
|
+
[session beginConfiguration];
|
|
74
|
+
[session setMultitaskingCameraAccessEnabled:enable];
|
|
75
|
+
[session commitConfiguration];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
RCTLog(@"[VideoCaptureController] Capture will start");
|
|
80
|
+
|
|
81
|
+
// Starting the capture happens on another thread. Wait for it.
|
|
82
|
+
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
|
|
83
|
+
|
|
84
|
+
__weak VideoCaptureController *weakSelf = self;
|
|
85
|
+
[self.capturer startCaptureWithDevice:self.device
|
|
86
|
+
format:format
|
|
87
|
+
fps:self.frameRate
|
|
88
|
+
completionHandler:^(NSError *err) {
|
|
89
|
+
if (err) {
|
|
90
|
+
RCTLogError(@"[VideoCaptureController] Error starting capture: %@", err);
|
|
91
|
+
} else {
|
|
92
|
+
RCTLog(@"[VideoCaptureController] Capture started");
|
|
93
|
+
weakSelf.running = YES;
|
|
94
|
+
}
|
|
95
|
+
dispatch_semaphore_signal(semaphore);
|
|
96
|
+
}];
|
|
97
|
+
|
|
98
|
+
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
- (void)stopCapture {
|
|
102
|
+
if (!self.running)
|
|
103
|
+
return;
|
|
104
|
+
|
|
105
|
+
RCTLog(@"[VideoCaptureController] Capture will stop");
|
|
106
|
+
// Stopping the capture happens on another thread. Wait for it.
|
|
107
|
+
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
|
|
108
|
+
|
|
109
|
+
__weak VideoCaptureController *weakSelf = self;
|
|
110
|
+
[self.capturer stopCaptureWithCompletionHandler:^{
|
|
111
|
+
RCTLog(@"[VideoCaptureController] Capture stopped");
|
|
112
|
+
weakSelf.running = NO;
|
|
113
|
+
weakSelf.device = nil;
|
|
114
|
+
|
|
115
|
+
dispatch_semaphore_signal(semaphore);
|
|
116
|
+
}];
|
|
117
|
+
|
|
118
|
+
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
- (void)determineDevice:(NSDictionary *)constraints {
|
|
122
|
+
// Clear device to prepare for starting camera with new constraints.
|
|
123
|
+
self.device = nil;
|
|
124
|
+
NSString *deviceId = constraints[@"deviceId"];
|
|
125
|
+
id facingMode = constraints[@"facingMode"];
|
|
126
|
+
|
|
127
|
+
if (!facingMode && !deviceId) {
|
|
128
|
+
// Default to front camera.
|
|
129
|
+
facingMode = @"user";
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (facingMode && [facingMode isKindOfClass:[NSString class]]) {
|
|
133
|
+
AVCaptureDevicePosition position;
|
|
134
|
+
if ([facingMode isEqualToString:@"environment"]) {
|
|
135
|
+
position = AVCaptureDevicePositionBack;
|
|
136
|
+
} else if ([facingMode isEqualToString:@"user"]) {
|
|
137
|
+
position = AVCaptureDevicePositionFront;
|
|
138
|
+
} else {
|
|
139
|
+
// If the specified facingMode value is not supported, fall back
|
|
140
|
+
// to the front camera.
|
|
141
|
+
position = AVCaptureDevicePositionFront;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
BOOL usingFrontCamera = position == AVCaptureDevicePositionFront;
|
|
145
|
+
if (self.usingFrontCamera != usingFrontCamera) {
|
|
146
|
+
self.usingFrontCamera = usingFrontCamera;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
if (!deviceId) {
|
|
151
|
+
AVCaptureDevicePosition position =
|
|
152
|
+
self.usingFrontCamera ? AVCaptureDevicePositionFront : AVCaptureDevicePositionBack;
|
|
153
|
+
deviceId = [self findDeviceForPosition:position].uniqueID;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
if (self.deviceId != deviceId && ![self.deviceId isEqualToString:deviceId]) {
|
|
157
|
+
self.deviceId = deviceId;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
- (void)applyConstraints:(NSDictionary *)constraints error:(NSError **)outError {
|
|
162
|
+
BOOL hasChanged = NO;
|
|
163
|
+
|
|
164
|
+
int width = [constraints[@"width"] intValue];
|
|
165
|
+
int height = [constraints[@"height"] intValue];
|
|
166
|
+
int frameRate = [constraints[@"frameRate"] intValue];
|
|
167
|
+
|
|
168
|
+
if (self.width != width) {
|
|
169
|
+
hasChanged = YES;
|
|
170
|
+
self.width = width;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (self.height != height) {
|
|
174
|
+
hasChanged = YES;
|
|
175
|
+
self.height = height;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (self.frameRate != frameRate) {
|
|
179
|
+
hasChanged = YES;
|
|
180
|
+
self.frameRate = frameRate;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (self.running && hasChanged) {
|
|
184
|
+
[self stopCapture];
|
|
185
|
+
[self startCapture];
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
- (NSDictionary *)getSettings {
|
|
190
|
+
AVCaptureDeviceFormat *format = self.selectedFormat;
|
|
191
|
+
CMVideoDimensions dimensions = CMVideoFormatDescriptionGetDimensions(format.formatDescription);
|
|
192
|
+
NSMutableDictionary *settings = [[NSMutableDictionary alloc] initWithDictionary:@{
|
|
193
|
+
@"groupId" : @"",
|
|
194
|
+
@"height" : @(dimensions.height),
|
|
195
|
+
@"width" : @(dimensions.width),
|
|
196
|
+
@"frameRate" : @(30),
|
|
197
|
+
@"facingMode" : self.usingFrontCamera ? @"user" : @"environment"
|
|
198
|
+
}];
|
|
199
|
+
|
|
200
|
+
if (self.deviceId) {
|
|
201
|
+
settings[@"deviceId"] = self.deviceId;
|
|
202
|
+
}
|
|
203
|
+
return settings;
|
|
204
|
+
}
|
|
205
|
+
#pragma mark NSKeyValueObserving
|
|
206
|
+
|
|
207
|
+
- (void)observeValueForKeyPath:(NSString *)keyPath
|
|
208
|
+
ofObject:(id)object
|
|
209
|
+
change:(NSDictionary<NSKeyValueChangeKey, id> *)change
|
|
210
|
+
context:(void *)context {
|
|
211
|
+
if (@available(iOS 11.1, *)) {
|
|
212
|
+
if ([object isKindOfClass:[AVCaptureDevice class]] && [keyPath isEqualToString:@"systemPressureState"]) {
|
|
213
|
+
AVCaptureDevice *device = (AVCaptureDevice *)object;
|
|
214
|
+
AVCaptureSystemPressureLevel pressureLevel =
|
|
215
|
+
((AVCaptureSystemPressureState *)change[NSKeyValueChangeNewKey]).level;
|
|
216
|
+
if (pressureLevel == AVCaptureSystemPressureLevelSerious ||
|
|
217
|
+
pressureLevel == AVCaptureSystemPressureLevelCritical) {
|
|
218
|
+
RCTLogWarn(
|
|
219
|
+
@"[VideoCaptureController] Reached elevated system pressure level: %@. Throttling frame rate.",
|
|
220
|
+
pressureLevel);
|
|
221
|
+
[self throttleFrameRateForDevice:device];
|
|
222
|
+
} else if (pressureLevel == AVCaptureSystemPressureLevelNominal) {
|
|
223
|
+
RCTLogWarn(@"[VideoCaptureController] Restored normal system pressure level. Resetting frame rate to "
|
|
224
|
+
@"default.");
|
|
225
|
+
[self resetFrameRateForDevice:device];
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
- (void)registerSystemPressureStateObserverForDevice:(AVCaptureDevice *)device {
|
|
232
|
+
if (@available(iOS 11.1, *)) {
|
|
233
|
+
[device addObserver:self forKeyPath:@"systemPressureState" options:NSKeyValueObservingOptionNew context:nil];
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
- (void)removeObserverForDevice:(AVCaptureDevice *)device {
|
|
238
|
+
if (@available(iOS 11.1, *)) {
|
|
239
|
+
[device removeObserver:self forKeyPath:@"systemPressureState"];
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
#pragma mark Private
|
|
244
|
+
|
|
245
|
+
- (void)setDevice:(AVCaptureDevice *)device {
|
|
246
|
+
if (_device) {
|
|
247
|
+
[self removeObserverForDevice:_device];
|
|
248
|
+
}
|
|
249
|
+
if (device) {
|
|
250
|
+
[self registerSystemPressureStateObserverForDevice:device];
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
_device = device;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
- (AVCaptureDevice *)findDeviceForPosition:(AVCaptureDevicePosition)position {
|
|
257
|
+
NSArray<AVCaptureDevice *> *captureDevices = [RTCCameraVideoCapturer captureDevices];
|
|
258
|
+
for (AVCaptureDevice *device in captureDevices) {
|
|
259
|
+
if (device.position == position) {
|
|
260
|
+
return device;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
return [captureDevices firstObject];
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
- (AVCaptureDeviceFormat *)selectFormatForDevice:(AVCaptureDevice *)device
|
|
268
|
+
withTargetWidth:(int)targetWidth
|
|
269
|
+
withTargetHeight:(int)targetHeight {
|
|
270
|
+
NSArray<AVCaptureDeviceFormat *> *formats = [RTCCameraVideoCapturer supportedFormatsForDevice:device];
|
|
271
|
+
AVCaptureDeviceFormat *selectedFormat = nil;
|
|
272
|
+
int currentDiff = INT_MAX;
|
|
273
|
+
|
|
274
|
+
for (AVCaptureDeviceFormat *format in formats) {
|
|
275
|
+
// Only use multi cam formats when on multi cam supported devices.
|
|
276
|
+
if (@available(iOS 13.0, macOS 14.0, tvOS 17.0, *)) {
|
|
277
|
+
if (AVCaptureMultiCamSession.multiCamSupported && !format.multiCamSupported) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
CMVideoDimensions dimension = CMVideoFormatDescriptionGetDimensions(format.formatDescription);
|
|
283
|
+
FourCharCode pixelFormat = CMFormatDescriptionGetMediaSubType(format.formatDescription);
|
|
284
|
+
int diff = abs(targetWidth - dimension.width) + abs(targetHeight - dimension.height);
|
|
285
|
+
if (diff < currentDiff) {
|
|
286
|
+
selectedFormat = format;
|
|
287
|
+
currentDiff = diff;
|
|
288
|
+
} else if (diff == currentDiff && pixelFormat == [_capturer preferredOutputPixelFormat]) {
|
|
289
|
+
selectedFormat = format;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
return selectedFormat;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
- (void)throttleFrameRateForDevice:(AVCaptureDevice *)device {
|
|
297
|
+
NSError *error = nil;
|
|
298
|
+
|
|
299
|
+
[device lockForConfiguration:&error];
|
|
300
|
+
if (error) {
|
|
301
|
+
RCTLog(@"[VideoCaptureController] Could not lock device for configuration: %@", error);
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
device.activeVideoMinFrameDuration = CMTimeMake(1, 20);
|
|
306
|
+
device.activeVideoMaxFrameDuration = CMTimeMake(1, 15);
|
|
307
|
+
|
|
308
|
+
[device unlockForConfiguration];
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
- (void)resetFrameRateForDevice:(AVCaptureDevice *)device {
|
|
312
|
+
NSError *error = nil;
|
|
313
|
+
|
|
314
|
+
[device lockForConfiguration:&error];
|
|
315
|
+
if (error) {
|
|
316
|
+
RCTLog(@"[VideoCaptureController] Could not lock device for configuration: %@", error);
|
|
317
|
+
return;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
device.activeVideoMinFrameDuration = kCMTimeInvalid;
|
|
321
|
+
device.activeVideoMaxFrameDuration = kCMTimeInvalid;
|
|
322
|
+
|
|
323
|
+
[device unlockForConfiguration];
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
@end
|
|
327
|
+
|
|
328
|
+
#endif
|