Skip to content

Commit 83b5132

Browse files
committed
Merge branch 'original_main' into chore/sync_0.12.12
# Conflicts: # pubspec.yaml
2 parents 84b2d7f + b88a93f commit 83b5132

18 files changed

+4124
-4577
lines changed

CHANGELOG.md

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
1+
12
# Changelog
23

3-
--------------------------------------------
4+
[0.12.12] - 2025-03-09
5+
6+
* [Android] feat: Migrate to the new Surface API. (#1726)
7+
* [Chore] chore: fix sponsors logo and links.
8+
9+
[0.12.11] - 2025-02-23
10+
11+
* [web] bump version for dart_webrtc.
12+
* [web] fix: compile error for web with --wasm.
13+
14+
[0.12.10] - 2025-02-18
15+
16+
* [web] bump version for dart_webrtc.
17+
* [web] fix: compile error for web with --wasm.
418

519
[0.12.9+1] - 2025-02-17
620

README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ WebRTC plugin for Flutter Mobile/Desktop/Web
88
<p align="center">
99
<strong>Sponsored with 💖 &nbsp by</strong><br />
1010
<a href="https://getstream.io/chat/flutter/tutorial/?utm_source=https://github.com/flutter-webrtc/flutter-webrtc&utm_medium=github&utm_content=developer&utm_term=flutter" target="_blank">
11-
<img src="https://stream-blog-v2.imgix.net/blog/wp-content/uploads/f7401112f41742c4e173c30d4f318cb8/stream_logo_white.png?w=350" alt="Stream Chat" style="margin: 8px" />
11+
<img src="assets/sponsors/stream-logo.png" alt="Stream Chat" style="margin: 8px; width: 350px" />
1212
</a>
1313
<br />
1414
Enterprise Grade APIs for Feeds, Chat, & Video. <a href="https://getstream.io/video/docs/flutter/?utm_source=https://github.com/flutter-webrtc/flutter-webrtc&utm_medium=sponsorship&utm_content=&utm_campaign=webrtcFlutterRepo_July2023_video_klmh22" target="_blank">Try the Flutter Video tutorial</a> 💬
@@ -17,10 +17,10 @@ Enterprise Grade APIs for Feeds, Chat, & Video. <a href="https://getstream.io/vi
1717
</br>
1818
<p align="center">
1919
<a href="https://livekit.io/?utm_source=opencollective&utm_medium=github&utm_campaign=flutter-webrtc" target="_blank">
20-
<img src="https://avatars.githubusercontent.com/u/69438833?s=92&v=4" alt="LiveKit" style="margin: 8px" />
20+
<img src="https://avatars.githubusercontent.com/u/69438833?s=200&v=4" alt="LiveKit" style="margin: 8px; width: 100px" />
2121
</a>
2222
<br />
23-
<a href="https://livekit.io/?utm_source=opencollective&utm_medium=github&utm_campaign=flutter-webrtc" target="_blank">LiveKit</a> - Open source WebRTC infrastructure
23+
<a href="https://livekit.io/?utm_source=opencollective&utm_medium=github&utm_campaign=flutter-webrtc" target="_blank">LiveKit</a> - Open source WebRTC and realtime AI infrastructure
2424
<p>
2525

2626
## Functionality
@@ -38,8 +38,8 @@ Enterprise Grade APIs for Feeds, Chat, & Video. <a href="https://getstream.io/vi
3838

3939
Additional platform/OS support from the other community
4040

41-
- flutter-tizen: https://github.com/flutter-tizen/plugins/tree/master/packages/flutter_webrtc
42-
- flutter-elinux(WIP): https://github.com/sony/flutter-elinux-plugins/issues/7
41+
- flutter-tizen: <https://github.com/flutter-tizen/plugins/tree/master/packages/flutter_webrtc>
42+
- flutter-elinux(WIP): <https://github.com/sony/flutter-elinux-plugins/issues/7>
4343

4444
Add `flutter_webrtc` as a [dependency in your pubspec.yaml file](https://flutter.io/using-packages/).
4545

@@ -56,7 +56,8 @@ Add the following entry to your _Info.plist_ file, located in `<project root>/io
5656

5757
This entry allows your app to access camera and microphone.
5858

59-
### Note for iOS.
59+
### Note for iOS
60+
6061
The WebRTC.xframework compiled after the m104 release no longer supports iOS arm devices, so need to add the `config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES'` to your ios/Podfile in your project
6162

6263
ios/Podfile
@@ -111,6 +112,7 @@ android {
111112
If necessary, in the same `build.gradle` you will need to increase `minSdkVersion` of `defaultConfig` up to `23` (currently default Flutter generator set it to `16`).
112113

113114
### Important reminder
115+
114116
When you compile the release apk, you need to add the following operations,
115117
[Setup Proguard Rules](https://github.com/flutter-webrtc/flutter-webrtc/blob/main/android/proguard-rules.pro)
116118

android/src/main/java/io/getstream/webrtc/flutter/FlutterRTCVideoRenderer.java

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import android.util.Log;
44
import android.graphics.SurfaceTexture;
5+
import android.view.Surface;
56

67
import io.getstream.webrtc.flutter.utils.AnyThreadSink;
78
import io.getstream.webrtc.flutter.utils.ConstraintsMap;
@@ -20,8 +21,7 @@
2021
public class FlutterRTCVideoRenderer implements EventChannel.StreamHandler {
2122

2223
private static final String TAG = FlutterWebRTCPlugin.TAG;
23-
private final SurfaceTexture texture;
24-
private final TextureRegistry.SurfaceTextureEntry entry;
24+
private final TextureRegistry.SurfaceProducer producer;
2525
private int id = -1;
2626
private MediaStream mediaStream;
2727

@@ -36,7 +36,7 @@ public void Dispose() {
3636
eventChannel.setStreamHandler(null);
3737

3838
eventSink = null;
39-
entry.release();
39+
producer.release();
4040
}
4141

4242
/**
@@ -100,15 +100,14 @@ public void onFrameResolutionChanged(
100100
EventChannel eventChannel;
101101
EventChannel.EventSink eventSink;
102102

103-
public FlutterRTCVideoRenderer(SurfaceTexture texture, TextureRegistry.SurfaceTextureEntry entry) {
103+
public FlutterRTCVideoRenderer(TextureRegistry.SurfaceProducer producer) {
104104
this.surfaceTextureRenderer = new SurfaceTextureRenderer("");
105105
listenRendererEvents();
106106
surfaceTextureRenderer.init(EglUtils.getRootEglBaseContext(), rendererEvents);
107-
surfaceTextureRenderer.surfaceCreated(texture);
107+
surfaceTextureRenderer.surfaceCreated(producer);
108108

109-
this.texture = texture;
110109
this.eventSink = null;
111-
this.entry = entry;
110+
this.producer = producer;
112111
this.ownerTag = null;
113112
}
114113

@@ -238,7 +237,7 @@ private void tryAddRendererToVideoTrack() throws Exception {
238237
surfaceTextureRenderer.release();
239238
listenRendererEvents();
240239
surfaceTextureRenderer.init(sharedContext, rendererEvents);
241-
surfaceTextureRenderer.surfaceCreated(texture);
240+
surfaceTextureRenderer.surfaceCreated(producer);
242241

243242
videoTrack.addSink(surfaceTextureRenderer);
244243
}

android/src/main/java/io/getstream/webrtc/flutter/FlutterWebRTCPlugin.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,6 @@ public MediaStreamTrack getRemoteTrack(String trackId) {
6565
return methodCallHandler.getRemoteTrack(trackId);
6666
}
6767

68-
6968
@Override
7069
public void onAttachedToEngine(@NonNull FlutterPluginBinding binding) {
7170
startListening(binding.getApplicationContext(), binding.getBinaryMessenger(),

android/src/main/java/io/getstream/webrtc/flutter/MethodCallHandlerImpl.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import android.os.Build;
1515
import android.util.Log;
1616
import android.util.LongSparseArray;
17+
import android.view.Surface;
1718

1819
import androidx.annotation.NonNull;
1920
import androidx.annotation.Nullable;
@@ -583,22 +584,21 @@ public void onMethodCall(MethodCall call, @NonNull Result notSafeResult) {
583584
break;
584585
}
585586
case "createVideoRenderer": {
586-
SurfaceTextureEntry entry = textures.createSurfaceTexture();
587-
SurfaceTexture surfaceTexture = entry.surfaceTexture();
588-
FlutterRTCVideoRenderer render = new FlutterRTCVideoRenderer(surfaceTexture, entry);
589-
renders.put(entry.id(), render);
587+
TextureRegistry.SurfaceProducer producer = textures.createSurfaceProducer();
588+
FlutterRTCVideoRenderer render = new FlutterRTCVideoRenderer(producer);
589+
renders.put(producer.id(), render);
590590

591591
EventChannel eventChannel =
592592
new EventChannel(
593593
messenger,
594-
"FlutterWebRTC/Texture" + entry.id());
594+
"FlutterWebRTC/Texture" + producer.id());
595595

596596
eventChannel.setStreamHandler(render);
597597
render.setEventChannel(eventChannel);
598-
render.setId((int) entry.id());
598+
render.setId((int) producer.id());
599599

600600
ConstraintsMap params = new ConstraintsMap();
601-
params.putInt("textureId", (int) entry.id());
601+
params.putInt("textureId", (int) producer.id());
602602
result.success(params.toMap());
603603
break;
604604
}

android/src/main/java/io/getstream/webrtc/flutter/SurfaceTextureRenderer.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.getstream.webrtc.flutter;
22

33
import android.graphics.SurfaceTexture;
4+
import android.view.Surface;
45

56
import org.webrtc.EglBase;
67
import org.webrtc.EglRenderer;
@@ -11,6 +12,8 @@
1112

1213
import java.util.concurrent.CountDownLatch;
1314

15+
import io.flutter.view.TextureRegistry;
16+
1417
/**
1518
* Display the video stream on a Surface.
1619
* renderFrame() is asynchronous to avoid blocking the calling thread.
@@ -95,19 +98,35 @@ public void pauseVideo() {
9598
// VideoSink interface.
9699
@Override
97100
public void onFrame(VideoFrame frame) {
98-
if(!isFirstFrameRendered) {
99-
texture.setDefaultBufferSize(frame.getRotatedWidth(), frame.getRotatedHeight());
100-
createEglSurface(texture);
101+
if(surface == null) {
102+
producer.setSize(frame.getRotatedWidth(),frame.getRotatedHeight());
103+
surface = producer.getSurface();
104+
createEglSurface(surface);
101105
}
102106
updateFrameDimensionsAndReportEvents(frame);
103107
super.onFrame(frame);
104108
}
105109

106-
private SurfaceTexture texture;
110+
private Surface surface = null;
111+
112+
private TextureRegistry.SurfaceProducer producer;
107113

108-
public void surfaceCreated(final SurfaceTexture texture) {
114+
public void surfaceCreated(final TextureRegistry.SurfaceProducer producer) {
109115
ThreadUtils.checkIsOnMainThread();
110-
this.texture = texture;
116+
this.producer = producer;
117+
this.producer.setCallback(
118+
new TextureRegistry.SurfaceProducer.Callback() {
119+
@Override
120+
public void onSurfaceAvailable() {
121+
// Do surface initialization here, and draw the current frame.
122+
}
123+
124+
@Override
125+
public void onSurfaceDestroyed() {
126+
surfaceDestroyed();
127+
}
128+
}
129+
);
111130
}
112131

113132
public void surfaceDestroyed() {
@@ -138,7 +157,7 @@ private void updateFrameDimensionsAndReportEvents(VideoFrame frame) {
138157
}
139158
rotatedFrameWidth = frame.getRotatedWidth();
140159
rotatedFrameHeight = frame.getRotatedHeight();
141-
texture.setDefaultBufferSize(rotatedFrameWidth, rotatedFrameHeight);
160+
producer.setSize(rotatedFrameWidth, rotatedFrameHeight);
142161
frameRotation = frame.getRotation();
143162
}
144163
}

assets/sponsors/stream-logo.png

20.8 KB
Loading

example/lib/main.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import 'package:stream_webrtc_flutter/stream_webrtc_flutter.dart';
1010
import 'src/device_enumeration_sample.dart';
1111
import 'src/get_display_media_sample.dart';
1212
import 'src/get_user_media_sample.dart'
13-
if (dart.library.html) 'src/get_user_media_sample_web.dart';
13+
if (dart.library.js_interop) 'src/get_user_media_sample_web.dart';
1414
import 'src/loopback_data_channel_sample.dart';
1515
import 'src/loopback_sample_unified_tracks.dart';
1616
import 'src/route_item.dart';

example/lib/src/get_user_media_sample.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class _GetUserMediaSampleState extends State<GetUserMediaSample> {
105105
print('Recording is not available on iOS');
106106
return;
107107
}
108+
108109
// TODO(rostopira): request write storage permission
109110
final storagePath = await getExternalStorageDirectory();
110111
if (storagePath == null) throw Exception('Can\'t find storagePath');

example/lib/src/loopback_sample_unified_tracks.dart

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,9 @@ class _MyAppState extends State<LoopBackSampleUnifiedTracks> {
132132
}
133133

134134
void _selectAudioInput(String deviceId) async {
135-
await Helper.selectAudioInput(deviceId);
135+
if (!WebRTC.platformIsWeb) {
136+
await Helper.selectAudioInput(deviceId);
137+
}
136138
}
137139

138140
void _cleanUp() async {
@@ -539,7 +541,9 @@ class _MyAppState extends State<LoopBackSampleUnifiedTracks> {
539541
void _switchSpeaker() async {
540542
setState(() {
541543
_speakerOn = !_speakerOn;
542-
Helper.setSpeakerphoneOn(_speakerOn);
544+
if (!WebRTC.platformIsWeb) {
545+
Helper.setSpeakerphoneOn(_speakerOn);
546+
}
543547
});
544548
}
545549

0 commit comments

Comments
 (0)