Skip to content

Commit 755b379

Browse files
committed
add custom encoder factory
1 parent b960c31 commit 755b379

File tree

5 files changed

+82
-4
lines changed

5 files changed

+82
-4
lines changed

webrtc-android-framework/src/main/java/io/antmedia/webrtcandroidframework/api/WebRTCClientConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public class WebRTCClientConfig {
7676
/*
7777
* Codec used for video encoding and decoding, default VP8
7878
*/
79-
public String videoCodec = "VP8";
79+
public String videoCodec = "H264";
8080

8181
/*
8282
* Flag for hardware codec acceleration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package io.antmedia.webrtcandroidframework.core;
2+
3+
import androidx.annotation.Nullable;
4+
5+
import org.webrtc.DefaultVideoDecoderFactory;
6+
import org.webrtc.EglBase;
7+
import org.webrtc.VideoCodecInfo;
8+
9+
import java.util.ArrayList;
10+
import java.util.Arrays;
11+
import java.util.LinkedHashSet;
12+
import java.util.List;
13+
14+
public class AMSDefaultVideoDecoderFactory extends DefaultVideoDecoderFactory {
15+
public AMSDefaultVideoDecoderFactory(@Nullable EglBase.Context eglContext) {
16+
super(eglContext);
17+
}
18+
19+
public VideoCodecInfo[] getSupportedCodecs() {
20+
List<VideoCodecInfo> supportedCodecInfos = new ArrayList<VideoCodecInfo>();
21+
// Generate a list of supported codecs in order of preference:
22+
// VP8, VP9, H264 (high profile), H264 (baseline profile) and AV1.
23+
for (AMSHardwareVideoEncoderFactory.VideoCodecMimeType type : new AMSHardwareVideoEncoderFactory.VideoCodecMimeType[] {AMSHardwareVideoEncoderFactory.VideoCodecMimeType.H264}) {
24+
25+
supportedCodecInfos.add(new VideoCodecInfo(
26+
type.name(), AMSHardwareVideoEncoderFactory.getDefaultH264Params( /* highProfile= */ true)));
27+
}
28+
29+
30+
return supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]);}
31+
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ public VideoEncoder createEncoder(VideoCodecInfo info) {
3838

3939
public VideoCodecInfo[] getSupportedCodecs() {
4040
LinkedHashSet<VideoCodecInfo> supportedCodecInfos = new LinkedHashSet();
41-
supportedCodecInfos.addAll(Arrays.asList(this.softwareVideoEncoderFactory.getSupportedCodecs()));
41+
//supportedCodecInfos.addAll(Arrays.asList(this.softwareVideoEncoderFactory.getSupportedCodecs()));
4242
supportedCodecInfos.addAll(Arrays.asList(this.hardwareVideoEncoderFactory.getSupportedCodecs()));
4343
return (VideoCodecInfo[])supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]);
4444
}
45+
4546
}

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

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,35 @@
44

55
import org.webrtc.EglBase;
66
import org.webrtc.HardwareVideoEncoderFactory;
7+
import org.webrtc.VideoCodecInfo;
8+
9+
import java.util.ArrayList;
10+
import java.util.HashMap;
11+
import java.util.List;
12+
import java.util.Map;
713

814
public class AMSHardwareVideoEncoderFactory extends HardwareVideoEncoderFactory {
915
public AMSHardwareVideoEncoderFactory(EglBase.Context sharedContext, boolean enableIntelVp8Encoder, boolean enableH264HighProfile) {
1016
super(sharedContext, enableIntelVp8Encoder, enableH264HighProfile);
1117
}
1218

19+
enum VideoCodecMimeType {
20+
VP8("video/x-vnd.on2.vp8"),
21+
VP9("video/x-vnd.on2.vp9"),
22+
H264("video/avc"),
23+
AV1("video/av01");
24+
25+
private final String mimeType;
26+
27+
private VideoCodecMimeType(String mimeType) {
28+
this.mimeType = mimeType;
29+
}
30+
31+
String mimeType() {
32+
return this.mimeType;
33+
}
34+
}
35+
1336
public boolean isHardwareSupportedInCurrentSdkH264(MediaCodecInfo info) {
1437
// First, H264 hardware might perform poorly on this model.
1538
String name = info.getName();
@@ -18,4 +41,27 @@ public boolean isHardwareSupportedInCurrentSdkH264(MediaCodecInfo info) {
1841
//ignore chipsets and return true for all of them
1942
return true;
2043
}
44+
45+
@Override
46+
public VideoCodecInfo[] getSupportedCodecs() {
47+
List<VideoCodecInfo> supportedCodecInfos = new ArrayList<VideoCodecInfo>();
48+
// Generate a list of supported codecs in order of preference:
49+
// VP8, VP9, H264 (high profile), H264 (baseline profile) and AV1.
50+
for (VideoCodecMimeType type : new VideoCodecMimeType[] {VideoCodecMimeType.H264}) {
51+
52+
supportedCodecInfos.add(new VideoCodecInfo(
53+
type.name(), getDefaultH264Params( /* highProfile= */ true)));
54+
}
55+
56+
57+
return supportedCodecInfos.toArray(new VideoCodecInfo[supportedCodecInfos.size()]);
58+
}
59+
60+
public static Map<String, String> getDefaultH264Params(boolean isHighProfile) {
61+
Map<String, String> params = new HashMap();
62+
params.put("level-asymmetry-allowed", "1");
63+
params.put("packetization-mode", "1");
64+
params.put("profile-level-id", isHighProfile ? "640c1f" : "42e01f");
65+
return params;
66+
}
2167
}

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,8 +1897,8 @@ private void createPeerConnectionFactoryInternal(PeerConnectionFactory.Options o
18971897
final VideoDecoderFactory decoderFactory;
18981898

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

0 commit comments

Comments
 (0)