Skip to content

Commit b960c31

Browse files
committed
add custom encoder factory
1 parent 7fc5290 commit b960c31

File tree

3 files changed

+67
-1
lines changed

3 files changed

+67
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package io.antmedia.webrtcandroidframework.core;
2+
3+
import androidx.annotation.Nullable;
4+
5+
import org.webrtc.EglBase;
6+
import org.webrtc.HardwareVideoEncoderFactory;
7+
import org.webrtc.SoftwareVideoEncoderFactory;
8+
import org.webrtc.VideoCodecInfo;
9+
import org.webrtc.VideoEncoder;
10+
import org.webrtc.VideoEncoderFactory;
11+
import org.webrtc.VideoEncoderFallback;
12+
13+
import java.util.Arrays;
14+
import java.util.LinkedHashSet;
15+
16+
public class AMSDefaultVideoEncoderFactory implements VideoEncoderFactory {
17+
private final VideoEncoderFactory hardwareVideoEncoderFactory;
18+
private final VideoEncoderFactory softwareVideoEncoderFactory = new SoftwareVideoEncoderFactory();
19+
20+
public AMSDefaultVideoEncoderFactory(EglBase.Context eglContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) {
21+
this.hardwareVideoEncoderFactory = new AMSHardwareVideoEncoderFactory(eglContext, enableIntelVp8Encoder, enableH264HighProfile);
22+
}
23+
24+
AMSDefaultVideoEncoderFactory(VideoEncoderFactory hardwareVideoEncoderFactory) {
25+
this.hardwareVideoEncoderFactory = hardwareVideoEncoderFactory;
26+
}
27+
28+
@Nullable
29+
public VideoEncoder createEncoder(VideoCodecInfo info) {
30+
VideoEncoder softwareEncoder = this.softwareVideoEncoderFactory.createEncoder(info);
31+
VideoEncoder hardwareEncoder = this.hardwareVideoEncoderFactory.createEncoder(info);
32+
if (hardwareEncoder != null && softwareEncoder != null) {
33+
return new VideoEncoderFallback(softwareEncoder, hardwareEncoder);
34+
} else {
35+
return hardwareEncoder != null ? hardwareEncoder : softwareEncoder;
36+
}
37+
}
38+
39+
public VideoCodecInfo[] getSupportedCodecs() {
40+
LinkedHashSet<VideoCodecInfo> supportedCodecInfos = new LinkedHashSet();
41+
supportedCodecInfos.addAll(Arrays.asList(this.softwareVideoEncoderFactory.getSupportedCodecs()));
42+
supportedCodecInfos.addAll(Arrays.asList(this.hardwareVideoEncoderFactory.getSupportedCodecs()));
43+
return (VideoCodecInfo[])supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]);
44+
}
45+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package io.antmedia.webrtcandroidframework.core;
2+
3+
import android.media.MediaCodecInfo;
4+
5+
import org.webrtc.EglBase;
6+
import org.webrtc.HardwareVideoEncoderFactory;
7+
8+
public class AMSHardwareVideoEncoderFactory extends HardwareVideoEncoderFactory {
9+
public AMSHardwareVideoEncoderFactory(EglBase.Context sharedContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) {
10+
super(sharedContext, enableIntelVp8Encoder, enableH264HighProfile);
11+
}
12+
13+
public boolean isHardwareSupportedInCurrentSdkH264(MediaCodecInfo info) {
14+
// First, H264 hardware might perform poorly on this model.
15+
String name = info.getName();
16+
// QCOM and Exynos H264 encoders are always supported.
17+
//return name.startsWith(QCOM_PREFIX) || name.startsWith(EXYNOS_PREFIX);
18+
//ignore chipsets and return true for all of them
19+
return true;
20+
}
21+
}

webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/core/WebRTCClient.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1897,7 +1897,7 @@ private void createPeerConnectionFactoryInternal(PeerConnectionFactory.Options o
18971897
final VideoDecoderFactory decoderFactory;
18981898

18991899
if (config.hwCodecAcceleration) {
1900-
encoderFactory = new DefaultVideoEncoderFactory(eglBase.getEglBaseContext(), true /* enableIntelVp8Encoder */, enableH264HighProfile);
1900+
encoderFactory = new AMSDefaultVideoEncoderFactory(eglBase.getEglBaseContext(), true /* enableIntelVp8Encoder */, enableH264HighProfile);
19011901
decoderFactory = new DefaultVideoDecoderFactory(eglBase.getEglBaseContext());
19021902
} else {
19031903
encoderFactory = new SoftwareVideoEncoderFactory();

0 commit comments

Comments
 (0)