8000 feat: Migrate to the new Surface API. (#1726) · 123wj2003/flutter-webrtc@076e095 · GitHub
[go: up one dir, main page]

Skip to content

Commit 076e095

Browse files
authored
feat: Migrate to the new Surface API. (flutter-webrtc#1726)
1 parent 0d529fc commit 076e095

File tree

4 files changed

+40
-23
lines changed

4 files changed

+40
-23
lines changed

android/src/main/java/com/cloudwebrtc/webrtc/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 com.cloudwebrtc.webrtc.utils.AnyThreadSink;
78
import com.cloudwebrtc.webrtc.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/com/cloudwebrtc/webrtc/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/com/cloudwebrtc/webrtc/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;
@@ -565,22 +566,21 @@ public void onMethodCall(MethodCall call, @NonNull Result notSafeResult) {
565566
break;
566567
}
567568
case "createVideoRenderer": {
568-
SurfaceTextureEntry entry = textures.createSurfaceTexture();
569-
SurfaceTexture surfaceTexture = entry.surfaceTexture();
570-
FlutterRTCVideoRenderer render = new FlutterRTCVideoRenderer(surfaceTexture, entry);
571-
renders.put(entry.id(), render);
569+
TextureRegistry.SurfaceProducer producer = textures.createSurfaceProducer();
570+
FlutterRTCVideoRenderer render = new FlutterRTCVideoRenderer(producer);
571+
renders.put(producer.id(), render);
572572

573573
EventChannel eventChannel =
574574
new EventChannel(
575575
messenger,
576-
"FlutterWebRTC/Texture" + entry.id());
576+
"FlutterWebRTC/Texture" + producer.id());
577577

578578
eventChannel.setStreamHandler(render);
579579
render.setEventChannel(eventChannel);
580-
render.setId((int) entry.id());
580+
render.setId((int) producer.id());
581581

582582
ConstraintsMap params = new ConstraintsMap();
583-
params.putInt("textureId", (int) entry.id());
583+
params.putInt("textureId", (int) producer.id());
584584
result.success(params.toMap());
585585
break;
586586
}

android/src/main/java/com/cloudwebrtc/webrtc/SurfaceTextureRenderer.java

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.cloudwebrtc.webrtc;
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
}

0 commit comments

Comments
 (0)
0