diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md index 4a0622dd3a..70e0869eff 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -2,6 +2,20 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [1.10.5](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-client-1.10.4...@stream-io/video-client-1.10.5) (2024-11-07) + + +### Bug Fixes + +* ignore maxSimulcastLayers override for SVC codecs ([#1564](https://github.com/GetStream/stream-video-js/issues/1564)) ([48f8abe](https://github.com/GetStream/stream-video-js/commit/48f8abe5fd5b48c367a04696febd582573def828)) + +## [1.10.4](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-client-1.10.3...@stream-io/video-client-1.10.4) (2024-11-07) + + +### Bug Fixes + +* max simulcast layers preference ([#1560](https://github.com/GetStream/stream-video-js/issues/1560)) ([2b0bf28](https://github.com/GetStream/stream-video-js/commit/2b0bf2824dce41c2709e361e0521cf85e1b2fd16)) + ## [1.10.3](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-client-1.10.2...@stream-io/video-client-1.10.3) (2024-11-05) diff --git a/packages/client/docusaurus/docs/javascript/02-guides/03-call-and-participant-state.mdx b/packages/client/docusaurus/docs/javascript/02-guides/03-call-and-participant-state.mdx index c4f02a53be..7971adfc36 100644 --- a/packages/client/docusaurus/docs/javascript/02-guides/03-call-and-participant-state.mdx +++ b/packages/client/docusaurus/docs/javascript/02-guides/03-call-and-participant-state.mdx @@ -151,6 +151,8 @@ const subscription = call.state.participants$.subscribe((participants) => { subscription.unsubscribe(); ``` +In a call with many participants, the value of the `participants$` call state observable is truncated to 250 participants. The participants who are publishing video, audio, or screen sharing have priority over the other participants in the list. This means, for example, that in a livestream with one host and many viewers, the host is guaranteed to be in the list. + ## Client state The client state can be accessed by `client.state`. diff --git a/packages/client/package.json b/packages/client/package.json index 14d4e1448b..29351904cf 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@stream-io/video-client", - "version": "1.10.3", + "version": "1.10.5", "packageManager": "yarn@3.2.4", "main": "dist/index.cjs.js", "module": "dist/index.es.js", diff --git a/packages/client/src/rtc/Publisher.ts b/packages/client/src/rtc/Publisher.ts index a55de6411e..aaf48c037a 100644 --- a/packages/client/src/rtc/Publisher.ts +++ b/packages/client/src/rtc/Publisher.ts @@ -394,7 +394,8 @@ export class Publisher { ? // for SVC, we only have one layer (q) and often rid is omitted enabledLayers[0] : // for non-SVC, we need to find the layer by rid (simulcast) - enabledLayers.find((l) => l.name === encoder.rid); + enabledLayers.find((l) => l.name === encoder.rid) ?? + (params.encodings.length === 1 ? enabledLayers[0] : undefined); // flip 'active' flag only when necessary const shouldActivate = !!layer?.active; diff --git a/packages/client/src/rtc/__tests__/Publisher.test.ts b/packages/client/src/rtc/__tests__/Publisher.test.ts index 9b73af5b95..84be566e29 100644 --- a/packages/client/src/rtc/__tests__/Publisher.test.ts +++ b/packages/client/src/rtc/__tests__/Publisher.test.ts @@ -360,6 +360,45 @@ describe('Publisher', () => { ]); }); + it('can dynamically activate/deactivate simulcast layers when rid is missing', async () => { + const transceiver = new RTCRtpTransceiver(); + const setParametersSpy = vi + .spyOn(transceiver.sender, 'setParameters') + .mockResolvedValue(); + const getParametersSpy = vi + .spyOn(transceiver.sender, 'getParameters') + .mockReturnValue({ + // @ts-expect-error incomplete data + codecs: [{ mimeType: 'video/VP8' }], + encodings: [{ active: false }], + }); + + // inject the transceiver + publisher['transceiverCache'].set(TrackType.VIDEO, transceiver); + + await publisher['changePublishQuality']([ + { + name: 'q', + active: true, + maxBitrate: 100, + scaleResolutionDownBy: 4, + maxFramerate: 30, + scalabilityMode: '', + }, + ]); + + expect(getParametersSpy).toHaveBeenCalled(); + expect(setParametersSpy).toHaveBeenCalled(); + expect(setParametersSpy.mock.calls[0][0].encodings).toEqual([ + { + active: true, + maxBitrate: 100, + scaleResolutionDownBy: 4, + maxFramerate: 30, + }, + ]); + }); + it('can dynamically update scalability mode in SVC', async () => { const transceiver = new RTCRtpTransceiver(); const setParametersSpy = vi diff --git a/packages/client/src/rtc/bitrateLookup.ts b/packages/client/src/rtc/bitrateLookup.ts index 70fcf6f6bd..448b1df922 100644 --- a/packages/client/src/rtc/bitrateLookup.ts +++ b/packages/client/src/rtc/bitrateLookup.ts @@ -6,8 +6,8 @@ const bitrateLookupTable: Record< > = { h264: { 2160: 5_000_000, - 1440: 3_500_000, - 1080: 2_750_000, + 1440: 3_000_000, + 1080: 2_000_000, 720: 1_250_000, 540: 750_000, 360: 400_000, diff --git a/packages/client/src/rtc/videoLayers.ts b/packages/client/src/rtc/videoLayers.ts index 5fede153b1..bbc2a359f1 100644 --- a/packages/client/src/rtc/videoLayers.ts +++ b/packages/client/src/rtc/videoLayers.ts @@ -65,7 +65,11 @@ export const findOptimalVideoLayers = ( const optimalVideoLayers: OptimalVideoLayer[] = []; const settings = videoTrack.getSettings(); const { width = 0, height = 0 } = settings; - const { scalabilityMode, bitrateDownscaleFactor = 2 } = publishOptions || {}; + const { + scalabilityMode, + bitrateDownscaleFactor = 2, + maxSimulcastLayers = 3, + } = publishOptions || {}; const maxBitrate = getComputedMaxBitrate( targetResolution, width, @@ -76,7 +80,8 @@ export const findOptimalVideoLayers = ( let downscaleFactor = 1; let bitrateFactor = 1; const svcCodec = isSvcCodec(codecInUse); - for (const rid of ['f', 'h', 'q']) { + const totalLayers = svcCodec ? 3 : Math.min(3, maxSimulcastLayers); + for (const rid of ['f', 'h', 'q'].slice(0, totalLayers)) { const layer: OptimalVideoLayer = { active: true, rid, diff --git a/packages/client/src/types.ts b/packages/client/src/types.ts index e32c82694e..3cb8a59858 100644 --- a/packages/client/src/types.ts +++ b/packages/client/src/types.ts @@ -181,6 +181,10 @@ export type PublishOptions = { * in simulcast mode (non-SVC). */ bitrateDownscaleFactor?: number; + /** + * The maximum number of simulcast layers to use when publishing the video stream. + */ + maxSimulcastLayers?: number; /** * Screen share settings. */ diff --git a/packages/react-bindings/CHANGELOG.md b/packages/react-bindings/CHANGELOG.md index 74987cebe5..a41ca06cd2 100644 --- a/packages/react-bindings/CHANGELOG.md +++ b/packages/react-bindings/CHANGELOG.md @@ -2,6 +2,16 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [1.1.16](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-bindings-1.1.15...@stream-io/video-react-bindings-1.1.16) (2024-11-07) + +### Dependency Updates + +* `@stream-io/video-client` updated to version `1.10.5` +## [1.1.15](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-bindings-1.1.14...@stream-io/video-react-bindings-1.1.15) (2024-11-07) + +### Dependency Updates + +* `@stream-io/video-client` updated to version `1.10.4` ## [1.1.14](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-bindings-1.1.13...@stream-io/video-react-bindings-1.1.14) (2024-11-05) ### Dependency Updates diff --git a/packages/react-bindings/package.json b/packages/react-bindings/package.json index 186dce2fb8..c75d4ffdcf 100644 --- a/packages/react-bindings/package.json +++ b/packages/react-bindings/package.json @@ -1,6 +1,6 @@ { "name": "@stream-io/video-react-bindings", - "version": "1.1.14", + "version": "1.1.16", "packageManager": "yarn@3.2.4", "main": "./dist/index.cjs.js", "module": "./dist/index.es.js", diff --git a/packages/react-native-sdk/CHANGELOG.md b/packages/react-native-sdk/CHANGELOG.md index 33baa3873d..9474205eec 100644 --- a/packages/react-native-sdk/CHANGELOG.md +++ b/packages/react-native-sdk/CHANGELOG.md @@ -2,6 +2,18 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [1.2.14](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.2.13...@stream-io/video-react-native-sdk-1.2.14) (2024-11-07) + +### Dependency Updates + +* `@stream-io/video-client` updated to version `1.10.5` +* `@stream-io/video-react-bindings` updated to version `1.1.16` +## [1.2.13](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.2.12...@stream-io/video-react-native-sdk-1.2.13) (2024-11-07) + +### Dependency Updates + +* `@stream-io/video-client` updated to version `1.10.4` +* `@stream-io/video-react-bindings` updated to version `1.1.15` ## [1.2.12](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-native-sdk-1.2.11...@stream-io/video-react-native-sdk-1.2.12) (2024-11-05) ### Dependency Updates diff --git a/packages/react-native-sdk/docusaurus/docs/reactnative/03-core/03-call-and-participant-state.mdx b/packages/react-native-sdk/docusaurus/docs/reactnative/03-core/03-call-and-participant-state.mdx index 620ab1fe27..20cd790ba3 100644 --- a/packages/react-native-sdk/docusaurus/docs/reactnative/03-core/03-call-and-participant-state.mdx +++ b/packages/react-native-sdk/docusaurus/docs/reactnative/03-core/03-call-and-participant-state.mdx @@ -205,10 +205,12 @@ const hosts = participants.filter((p) => p.roles.includes('host')); // participants that publish video and audio const videoParticipants = participants.filter( - (p) => hasVideo(p) && hasAudio(p), + (p) => hasVideo(p) && hasAudio(p) ); ``` +In a call with many participants, the list returned by the `useParticipants` call state hook is truncated to 250 participants. The participants who are publishing video, audio, or screen sharing have priority over the other participants in the list. This means, for example, that in a livestream with one host and many viewers, the host is guaranteed to be in the list. + ## Client state To observe client state you need to provide a `StreamVideoClient` instance to the `StreamVideo` context provider. diff --git a/packages/react-native-sdk/docusaurus/docs/reactnative/05-ui-cookbook/19-call-quality-rating.mdx b/packages/react-native-sdk/docusaurus/docs/reactnative/05-ui-cookbook/19-call-quality-rating.mdx new file mode 100644 index 0000000000..ea569029fd --- /dev/null +++ b/packages/react-native-sdk/docusaurus/docs/reactnative/05-ui-cookbook/19-call-quality-rating.mdx @@ -0,0 +1,120 @@ +--- +id: call-quality-rating +title: Call Quality Rating +--- + +## Introduction + +In this guide, we are going to show how one can build a call quality rating form on top of our React Native Video SDK. +It is a good practice to ask your end users about their overall experience after the end of the call or, while being in a call. + +Here is a preview of the component we are going to build: +![Preview of the UI](../assets/05-ui-cookbook/19-call-quality-rating/feedback.png) + +## Submit Feedback API + +Our React Native Video SDK provides an API for collecting this feedback which later can be seen in the call stats section of our dashboard. + +```ts +await call.submitFeedback( + rating, // a rating grade from 1 - 5, + { + reason: '', // optional reason message + custom: { + // ... any extra properties that you wish to collect + }, + } +); +``` + +## Implementation + +```tsx +import React, { useState } from 'react'; +import { + View, + Text, + TouchableOpacity, + StyleSheet, + Modal, + Image, +} from 'react-native'; +import { useCall } from '@stream-io/video-react-native-sdk'; +import Star from '../assets/Star'; +import Close from '../assets/Close'; + +const FeedbackModal: = () => { + const call = useCall(); + const [selectedRating, setSelectedRating] = useState(null); + + const handleRatingPress = (rating: number) => { + setSelectedRating(rating); + await call + ?.submitFeedback(Math.min(Math.max(1, rating), 5), { + reason: '', + }) + .catch((err) => console.warn('Failed to submit call feedback', err)); + }; + + return ( + + + + + + + + + + + + + + + We Value Your Feedback! + + Tell us about your video call experience. + + + + {[1, 2, 3, 4, 5].map((rating) => ( + handleRatingPress(rating)} + style={[styles.ratingButton]} + > + = rating + ? colors.iconAlertSuccess + : colors.typeSecondary + } + /> + + ))} + + + + Very Bad + + + Very Good + + + + + + ); +}; +``` + +:::note +For simplicity, the StyleSheet is not included in this guide. +::: diff --git a/packages/react-native-sdk/docusaurus/docs/reactnative/assets/05-ui-cookbook/19-call-quality-rating/feedback.png b/packages/react-native-sdk/docusaurus/docs/reactnative/assets/05-ui-cookbook/19-call-quality-rating/feedback.png new file mode 100644 index 0000000000..26abb8bbe6 Binary files /dev/null and b/packages/react-native-sdk/docusaurus/docs/reactnative/assets/05-ui-cookbook/19-call-quality-rating/feedback.png differ diff --git a/packages/react-native-sdk/package.json b/packages/react-native-sdk/package.json index 2acae63ee7..3dd2b23d86 100644 --- a/packages/react-native-sdk/package.json +++ b/packages/react-native-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@stream-io/video-react-native-sdk", - "version": "1.2.12", + "version": "1.2.14", "packageManager": "yarn@3.2.4", "main": "dist/commonjs/index.js", "module": "dist/module/index.js", diff --git a/packages/react-sdk/CHANGELOG.md b/packages/react-sdk/CHANGELOG.md index 04c16de107..593c26adea 100644 --- a/packages/react-sdk/CHANGELOG.md +++ b/packages/react-sdk/CHANGELOG.md @@ -2,6 +2,23 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [1.7.12](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-sdk-1.7.11...@stream-io/video-react-sdk-1.7.12) (2024-11-08) + +### Dependency Updates + +* `@stream-io/video-filters-web` updated to version `0.1.5` +## [1.7.11](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-sdk-1.7.10...@stream-io/video-react-sdk-1.7.11) (2024-11-07) + +### Dependency Updates + +* `@stream-io/video-client` updated to version `1.10.5` +* `@stream-io/video-react-bindings` updated to version `1.1.16` +## [1.7.10](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-sdk-1.7.9...@stream-io/video-react-sdk-1.7.10) (2024-11-07) + +### Dependency Updates + +* `@stream-io/video-client` updated to version `1.10.4` +* `@stream-io/video-react-bindings` updated to version `1.1.15` ## [1.7.9](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-react-sdk-1.7.8...@stream-io/video-react-sdk-1.7.9) (2024-11-05) ### Dependency Updates diff --git a/packages/react-sdk/docusaurus/docs/React/02-guides/03-call-and-participant-state.mdx b/packages/react-sdk/docusaurus/docs/React/02-guides/03-call-and-participant-state.mdx index e329305b40..d0d703b5d8 100644 --- a/packages/react-sdk/docusaurus/docs/React/02-guides/03-call-and-participant-state.mdx +++ b/packages/react-sdk/docusaurus/docs/React/02-guides/03-call-and-participant-state.mdx @@ -207,6 +207,8 @@ const videoParticipants = participants.filter( ); ``` +In a call with many participants, the list returned by the `useParticipants` call state hook is truncated to 250 participants. The participants who are publishing video, audio, or screen sharing have priority over the other participants in the list. This means, for example, that in a livestream with one host and many viewers, the host is guaranteed to be in the list. + ## Client state To observe client state you need to provide a `StreamVideoClient` instance to the `StreamVideo` context provider. diff --git a/packages/react-sdk/package.json b/packages/react-sdk/package.json index a5efd1262b..d735b649b1 100644 --- a/packages/react-sdk/package.json +++ b/packages/react-sdk/package.json @@ -1,6 +1,6 @@ { "name": "@stream-io/video-react-sdk", - "version": "1.7.9", + "version": "1.7.12", "packageManager": "yarn@3.2.4", "main": "./dist/index.cjs.js", "module": "./dist/index.es.js", diff --git a/packages/react-sdk/src/components/BackgroundFilters/BackgroundFilters.tsx b/packages/react-sdk/src/components/BackgroundFilters/BackgroundFilters.tsx index d42b6238df..04639d40de 100644 --- a/packages/react-sdk/src/components/BackgroundFilters/BackgroundFilters.tsx +++ b/packages/react-sdk/src/components/BackgroundFilters/BackgroundFilters.tsx @@ -145,7 +145,7 @@ export const BackgroundFiltersProvider = ( backgroundImages = [], backgroundFilter: bgFilterFromProps = undefined, backgroundImage: bgImageFromProps = undefined, - backgroundBlurLevel: bgBlurLevelFromProps = 'high', + backgroundBlurLevel: bgBlurLevelFromProps = undefined, tfFilePath, modelFilePath, basePath, @@ -173,7 +173,7 @@ export const BackgroundFiltersProvider = ( const disableBackgroundFilter = useCallback(() => { setBackgroundFilter(undefined); setBackgroundImage(undefined); - setBackgroundBlurLevel('high'); + setBackgroundBlurLevel(undefined); }, []); const [isSupported, setIsSupported] = useState(false); diff --git a/packages/video-filters-web/CHANGELOG.md b/packages/video-filters-web/CHANGELOG.md index 6a07c4404c..deaaf78979 100644 --- a/packages/video-filters-web/CHANGELOG.md +++ b/packages/video-filters-web/CHANGELOG.md @@ -2,6 +2,13 @@ This file was generated using [@jscutlery/semver](https://github.com/jscutlery/semver). +## [0.1.5](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-filters-web-0.1.4...@stream-io/video-filters-web-0.1.5) (2024-11-08) + + +### Bug Fixes + +* guard against null fenceSync ([#1565](https://github.com/GetStream/stream-video-js/issues/1565)) ([9a3ae38](https://github.com/GetStream/stream-video-js/commit/9a3ae385ebed5b7fd44855ed2a7b7fc01ac53792)) + ## [0.1.4](https://github.com/GetStream/stream-video-js/compare/@stream-io/video-filters-web-0.1.3...@stream-io/video-filters-web-0.1.4) (2024-09-19) diff --git a/packages/video-filters-web/package.json b/packages/video-filters-web/package.json index 042b910ac7..82295c6a63 100644 --- a/packages/video-filters-web/package.json +++ b/packages/video-filters-web/package.json @@ -1,6 +1,6 @@ { "name": "@stream-io/video-filters-web", - "version": "0.1.4", + "version": "0.1.5", "packageManager": "yarn@3.5.0", "main": "./dist/index.cjs.js", "module": "./dist/index.es.js", diff --git a/packages/video-filters-web/src/helpers/webglHelper.ts b/packages/video-filters-web/src/helpers/webglHelper.ts index dd6a49f82b..4f8df20a86 100644 --- a/packages/video-filters-web/src/helpers/webglHelper.ts +++ b/packages/video-filters-web/src/helpers/webglHelper.ts @@ -111,8 +111,10 @@ async function getBufferSubDataAsync( dstOffset?: number, length?: number, ) { - const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0)!; + const sync = gl.fenceSync(gl.SYNC_GPU_COMMANDS_COMPLETE, 0); gl.flush(); + if (!sync) return; + const res = await clientWaitAsync(gl, sync); gl.deleteSync(sync); diff --git a/packages/video-filters-web/src/webgl2/resizingStage.ts b/packages/video-filters-web/src/webgl2/resizingStage.ts index 91057ff688..d026b2b101 100644 --- a/packages/video-filters-web/src/webgl2/resizingStage.ts +++ b/packages/video-filters-web/src/webgl2/resizingStage.ts @@ -15,6 +15,7 @@ export function buildResizingStage( texCoordBuffer: WebGLBuffer, tflite: TFLite, segmentationConfig: SegmentationParams, + onError?: (error: any) => void, ) { const fragmentShaderSource = glsl`#version 300 es @@ -81,7 +82,9 @@ export function buildResizingStage( gl.RGBA, gl.UNSIGNED_BYTE, outputPixels, - ); + ).catch((error: any) => { + onError?.(error); + }); for (let i = 0; i < outputPixelCount; i++) { const tfliteIndex = tfliteInputMemoryOffset + i * 3; diff --git a/packages/video-filters-web/src/webgl2/webgl2Pipeline.ts b/packages/video-filters-web/src/webgl2/webgl2Pipeline.ts index 072442c084..fb6c6d6854 100644 --- a/packages/video-filters-web/src/webgl2/webgl2Pipeline.ts +++ b/packages/video-filters-web/src/webgl2/webgl2Pipeline.ts @@ -22,6 +22,7 @@ export function buildWebGL2Pipeline( canvas: HTMLCanvasElement, tflite: TFLite, segmentationConfig: SegmentationParams, + onError?: (error: any) => void, ) { const gl = canvas.getContext('webgl2')!; if (!gl) throw new Error('WebGL2 is not supported'); @@ -95,6 +96,7 @@ export function buildWebGL2Pipeline( texCoordBuffer, tflite, segmentationConfig, + onError, ); const loadSegmentationStage = buildSoftmaxStage( gl, diff --git a/sample-apps/react-native/dogfood/ios/Podfile.lock b/sample-apps/react-native/dogfood/ios/Podfile.lock index 32a45d81db..0d405e0962 100644 --- a/sample-apps/react-native/dogfood/ios/Podfile.lock +++ b/sample-apps/react-native/dogfood/ios/Podfile.lock @@ -1145,10 +1145,10 @@ PODS: - RCT-Folly (= 2022.05.16.00) - React-Core - stream-react-native-webrtc - - stream-react-native-webrtc (125.0.0-alpha.1): + - stream-react-native-webrtc (125.0.0-rc.1): - React-Core - WebRTC-SDK (~> 125.6422.05) - - stream-video-react-native (1.2.10): + - stream-video-react-native (1.2.12): - glog - RCT-Folly (= 2022.05.16.00) - React-Core @@ -1478,8 +1478,8 @@ SPEC CHECKSUMS: RNVoipPushNotification: 543e18f83089134a35e7f1d2eba4c8b1f7776b08 SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 stream-io-video-filters-react-native: 8c345e6adf5164646696d45f9962c4199b2fe3b9 - stream-react-native-webrtc: e3a201b101ee5dc194daf8915aeacc54f0ba53c5 - stream-video-react-native: fc9c932706eba2416db5416335f69bd33d64d7ab + stream-react-native-webrtc: 976646e6e3643d331fc4da20e4be04ea16af295b + stream-video-react-native: f6aa195dbaf9f72945ad2d16d709dc1e40ceee2b TOCropViewController: 80b8985ad794298fb69d3341de183f33d1853654 WebRTC-SDK: 1990a1a595bd0b59c17485ce13ff17f575732c12 Yoga: 1b901a6d6eeba4e8a2e8f308f708691cdb5db312 diff --git a/sample-apps/react-native/dogfood/ios/StreamReactNativeVideoSDKSample/AppDelegate.mm b/sample-apps/react-native/dogfood/ios/StreamReactNativeVideoSDKSample/AppDelegate.mm index 8c3f92a15f..bea64335c2 100644 --- a/sample-apps/react-native/dogfood/ios/StreamReactNativeVideoSDKSample/AppDelegate.mm +++ b/sample-apps/react-native/dogfood/ios/StreamReactNativeVideoSDKSample/AppDelegate.mm @@ -13,6 +13,7 @@ // @react-native-community/push-notification-ios #import #import +#import #import "StreamVideoReactNative.h" @@ -123,6 +124,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:( UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter]; center.delegate = self; + WebRTCModuleOptions *options = [WebRTCModuleOptions sharedInstance]; +// uncomment below to see native webrtc logs +// options.loggingSeverity = RTCLoggingSeverityInfo; + return [super application:application didFinishLaunchingWithOptions:launchOptions]; } diff --git a/sample-apps/react-native/dogfood/package.json b/sample-apps/react-native/dogfood/package.json index 5493988a06..335e0f5946 100644 --- a/sample-apps/react-native/dogfood/package.json +++ b/sample-apps/react-native/dogfood/package.json @@ -1,6 +1,6 @@ { "name": "@stream-io/video-react-native-dogfood", - "version": "4.4.12", + "version": "4.4.14", "private": true, "scripts": { "android": "react-native run-android", @@ -30,7 +30,7 @@ "@react-navigation/native": "^6.1.10", "@react-navigation/native-stack": "^6.9.18", "@stream-io/flat-list-mvcp": "^0.10.3", - "@stream-io/react-native-webrtc": "125.0.0-alpha.1", + "@stream-io/react-native-webrtc": "125.0.0-rc.1", "@stream-io/video-filters-react-native": "workspace:^", "@stream-io/video-react-native-sdk": "workspace:^", "react": "18.2.0", diff --git a/sample-apps/react/react-dogfood/components/MeetingUI.tsx b/sample-apps/react/react-dogfood/components/MeetingUI.tsx index 5479dae277..7b74d416d6 100644 --- a/sample-apps/react/react-dogfood/components/MeetingUI.tsx +++ b/sample-apps/react/react-dogfood/components/MeetingUI.tsx @@ -56,6 +56,9 @@ export const MeetingUI = ({ chatClient, mode }: MeetingUIProps) => { const scalabilityMode = router.query['scalability_mode'] as | string | undefined; + const maxSimulcastLayers = router.query['max_simulcast_layers'] as + | string + | undefined; const onJoin = useCallback( async ({ fastJoin = false } = {}) => { @@ -74,6 +77,9 @@ export const MeetingUI = ({ chatClient, mode }: MeetingUIProps) => { bitrateDownscaleFactor: bitrateFactorOverride ? parseInt(bitrateFactorOverride, 10) : 2, // default to 2 + maxSimulcastLayers: maxSimulcastLayers + ? parseInt(maxSimulcastLayers, 10) + : 3, // default to 3 }); await call.join({ create: true }); diff --git a/yarn.lock b/yarn.lock index 0642bcd8e8..b5cfadc655 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7760,16 +7760,16 @@ __metadata: languageName: node linkType: hard -"@stream-io/react-native-webrtc@npm:125.0.0-alpha.1": - version: 125.0.0-alpha.1 - resolution: "@stream-io/react-native-webrtc@npm:125.0.0-alpha.1" +"@stream-io/react-native-webrtc@npm:125.0.0-rc.1": + version: 125.0.0-rc.1 + resolution: "@stream-io/react-native-webrtc@npm:125.0.0-rc.1" dependencies: base64-js: 1.5.1 debug: 4.3.4 event-target-shim: 6.0.2 peerDependencies: react-native: ">=0.60.0" - checksum: 582eb9b32548484af02821d2d46d96885066c296324d0ac29b019a674a77e5a941c1ec6cdc8b19f7ae4da80e75ee7c9d8a9efb0dfaaab9533abc524dc4db383d + checksum: 1f2046eea92d128244949ec87f0ff92cc4a1940c56dc14e23ba41b6237048073c9db36f4b0c7fddfccda75dbbb532404d9425e97fe96ad18a983e7ec00213505 languageName: node linkType: hard @@ -7989,7 +7989,7 @@ __metadata: "@rnx-kit/metro-config": ^1.3.3 "@rnx-kit/metro-resolver-symlinks": ^0.1.22 "@stream-io/flat-list-mvcp": ^0.10.3 - "@stream-io/react-native-webrtc": 125.0.0-alpha.1 + "@stream-io/react-native-webrtc": 125.0.0-rc.1 "@stream-io/video-filters-react-native": "workspace:^" "@stream-io/video-react-native-sdk": "workspace:^" "@types/eslint": ^8.56.10