8000 feat: support force SW codec list for android, and disable HW codec f… · InventYang/flutter-webrtc@c745864 · GitHub
[go: up one dir, main page]

Skip to content

Commit c745864

Browse files
authored
feat: support force SW codec list for android, and disable HW codec for VP9 by default. (flutter-webrtc#1415)
1 parent 5e6e3da commit c745864

File tree

3 files changed

+149
-15
lines changed

3 files changed

+149
-15
lines changed

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

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@
6868
import org.webrtc.WrappedVideoDecoderFactory;
6969
import org.webrtc.audio.AudioDeviceModule;
7070
import org.webrtc.audio.JavaAudioDeviceModule;
71+
import org.webrtc.video.CustomVideoDecoderFactory;
72+
import org.webrtc.video.CustomVideoEncoderFactory;
7173

7274
import java.io.File;
7375
import java.io.UnsupportedEncodingException;
@@ -112,6 +114,10 @@ public class MethodCallHandlerImpl implements MethodCallHandler, StateProvider {
112114

113115
private Activity activity;
114116

117+
private CustomVideoEncoderFactory videoEncoderFactory;
118+
119+
private CustomVideoDecoderFactory videoDecoderFactory;
120+
115121
MethodCallHandlerImpl(Context context, BinaryMessenger messenger, TextureRegistry textureRegistry) {
116122
this.context = context;
117123
this.textures = textureRegistry;
@@ -140,7 +146,7 @@ void dispose() {
140146
mPeerConnectionObservers.clear();
141147
}
142148

143-
private void initialize(int networkIgnoreMask, boolean forceSWCodec) {
149+
private void initialize(int networkIgnoreMask, boolean forceSWCodec, List<String> forceSWCodecList) {
144150
if (mFactory != null) {
145151
return;
146152
}
@@ -150,8 +156,6 @@ private void initialize(int networkIgnoreMask, boolean forceSWCodec) {
150156
.setEnableInternalTracer(true)
151157
.createInitializationOptions());
152158

153-
154-
155159
getUserMediaImpl = new GetUserMediaImpl(this, context);
156160

157161
frameCryptor = new FlutterRTCFrameCryptor(this);
@@ -170,18 +174,21 @@ private void initialize(int networkIgnoreMask, boolean forceSWCodec) {
170174
final PeerConnectionFactory.Builder factoryBuilder = PeerConnectionFactory.builder()
171175
.setOptions(options);
172176

173-
if (forceSWCodec) {
174-
factoryBuilder
175-
.setVideoEncoderFactory(new SoftwareVideoEncoderFactory())
176-
.setVideoDecoderFactory(new SoftwareVideoDecoderFactory());
177-
} else {
178-
// Initialize EGL contexts required for HW acceleration.
179-
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
177+
// Initialize EGL contexts required for HW acceleration.
178+
EglBase.Context eglContext = EglUtils.getRootEglBaseContext();
179+
180+
videoEncoderFactory = new CustomVideoEncoderFactory(eglContext, true, true);
181+
videoDecoderFactory = new CustomVideoDecoderFactory(eglContext);
182+
183+
factoryBuilder
184+
.setVideoEncoderFactory(videoEncoderFactory)
185+
.setVideoDecoderFactory(videoDecoderFactory);
186+
187+
videoDecoderFactory.setForceSWCodec(forceSWCodec);
188+
videoDecoderFactory.setForceSWCodecList(forceSWCodecList);
189+
videoEncoderFactory.setForceSWCodec(forceSWCodec);
190+
videoEncoderFactory.setForceSWCodecList(forceSWCodecList);
180191

181-
factoryBuilder
182-
.setVideoEncoderFactory(new SimulcastVideoEncoderFactoryWrapper(eglContext, true, true))
183-
.setVideoDecoderFactory(new WrappedVideoDecoderFactory(eglContext));
184-
}
185192
mFactory = factoryBuilder
186193
.setAudioDeviceModule(audioDeviceModule)
187194
.createPeerConnectionFactory();
@@ -232,7 +239,18 @@ public void onMethodCall(MethodCall call, @NonNull Result notSafeResult) {
232239
final boolean v = constraintsMap.getBoolean("forceSWCodec");
233240
forceSWCodec = v;
234241
}
235-
initialize(networkIgnoreMask,forceSWCodec);
242+
List<String> forceSWCodecList = new ArrayList<>();
243+
if(constraintsMap.hasKey("forceSWCodecList")
244+
&& constraintsMap.getType("forceSWCodecList") == ObjectType.Array) {
245+
final List<Object> array = constraintsMap.getListArray("forceSWCodecList");
246+
for(Object v : array) {
247+
forceSWCodecList.add(v.toString());
248+
}
249+
} else {
250+
// disable HW Codec for VP9 by default.
251+
forceSWCodecList.add("VP9");
252+
}
253+
initialize(networkIgnoreMask,forceSWCodec, forceSWC 57AE odecList);
236254
result.success(null);
237255
break;
238256
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package org.webrtc.video;
2+
3+
import androidx.annotation.Nullable;
4+
5+
import org.webrtc.EglBase;
6+
import org.webrtc.SoftwareVideoDecoderFactory;
7+
import org.webrtc.VideoCodecInfo;
8+
import org.webrtc.VideoDecoder;
9+
import org.webrtc.VideoDecoderFactory;
10+
import org.webrtc.WrappedVideoDecoderFactory;
11+
12+
import java.util.ArrayList;
13+
import java.util.List;
14+
15+
public class CustomVideoDecoderFactory implements VideoDecoderFactory {
16+
private SoftwareVideoDecoderFactory softwareVideoDecoderFactory = new SoftwareVideoDecoderFactory();
17+
private WrappedVideoDecoderFactory wrappedVideoDecoderFactory;
18+
private boolean forceSWCodec = false;
19+
20+
private List<String> forceSWCodecs = new ArrayList<>();
21+
22+
public CustomVideoDecoderFactory(EglBase.Context sharedContext) {
23+
this.wrappedVideoDecoderFactory = new WrappedVideoDecoderFactory(sharedContext);
24+
}
25+
26+
public void setForceSWCodec(boolean forceSWCodec) {
27+
this.forceSWCodec = forceSWCodec;
28+
}
29+
30+
public void setForceSWCodecList(List<String> forceSWCodecs) {
31+
this.forceSWCodecs = forceSWCodecs;
32+
}
33+
34+
@Nullable
35+
@Override
36+
public VideoDecoder createDecoder(VideoCodecInfo videoCodecInfo) {
37+
if(forceSWCodec) {
38+
return softwareVideoDecoderFactory.createDecoder(videoCodecInfo);
39+
}
40+
if(!forceSWCodecs.isEmpty()) {
41+
if(forceSWCodecs.contains(videoCodecInfo.name)) {
42+
return softwareVideoDecoderFactory.createDecoder(videoCodecInfo);
43+
}
44+
}
45+
return wrappedVideoDecoderFactory.createDecoder(videoCodecInfo);
46+
}
47+
48+
@Override
49+
public VideoCodecInfo[] getSupportedCodecs() {
50+
if(forceSWCodec && forceSWCodecs.isEmpty()) {
51+
return softwareVideoDecoderFactory.getSupportedCodecs();
52+
}
53+
return wrappedVideoDecoderFactory.getSupportedCodecs();
54+
}
55+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package org.webrtc.video;
2+
3+
import androidx.annotation.Nullable;
4+
5+
import com.cloudwebrtc.webrtc.SimulcastVideoEncoderFactoryWrapper;
6+
7+
import org.webrtc.EglBase;
8+
import org.webrtc.SoftwareVideoEncoderFactory;
9+
import org.webrtc.VideoCodecInfo;
10+
import org.webrtc.VideoEncoder;
11+
import org.webrtc.VideoEncoderFactory;
12+
13+
import java.util.ArrayList;
14+
import java.util.List;
15+
16+
public class CustomVideoEncoderFactory implements VideoEncoderFactory {
17+
private SoftwareVideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
18+
private SimulcastVideoEncoderFactoryWrapper simulcastVideoEncoderFactoryWrapper;
19+
20+
private boolean forceSWCodec = false;
21+
22+
private List<String> forceSWCodecs = new ArrayList<>();
23+
24+
public CustomVideoEncoderFactory(EglBase.Context sharedContext,
25+
boolean enableIntelVp8Encoder,
26+
boolean enableH264HighProfile) {
27+
this.simulcastVideoEncoderFactoryWrapper = new SimulcastVideoEncoderFactoryWrapper(sharedContext, enableIntelVp8Encoder, enableH264HighProfile);
28+
}
29+
30+
public void setForceSWCodec(boolean forceSWCodec) {
31+
this.forceSWCodec = forceSWCodec;
32+
}
33+
34+
public void setForceSWCodecList(List<String> forceSWCodecs) {
35+
this.forceSWCodecs = forceSWCodecs;
36+
}
37+
38+
@Nullable
39+
@Override
40+
public VideoEncoder createEncoder(VideoCodecInfo videoCodecInfo) {
41+
if(forceSWCodec) {
42+
return softwareVideoEncoderFactory.createEncoder(videoCodecInfo);
43+
}
44+
45+
if(!forceSWCodecs.isEmpty()) {
46+
if(forceSWCodecs.contains(videoCodecInfo.name)) {
47+
return softwareVideoEncoderFactory.createEncoder(videoCodecInfo);
48+
}
49+
}
50+
51+
return simulcastVideoEncoderFactoryWrapper.createEncoder(videoCodecInfo);
52+
}
53+
54+
@Override
55+
public VideoCodecInfo[] getSupportedCodecs() {
56+
if(forceSWCodec && forceSWCodecs.isEmpty()) {
57+
return softwareVideoEncoderFactory.getSupportedCodecs();
58+
}
59+
return simulcastVideoEncoderFactoryWrapper.getSupportedCodecs();
60+
}
61+
}

0 commit comments

Comments
 (0)
0