Skip to content

Commit d27e2ce

Browse files
cloudwebrtcdavidliu
authored andcommitted
Merge pull request #3 from webrtc-sdk/android-simulcast
Support for simulcast in Android SDK
1 parent 1b9d9f6 commit d27e2ce

File tree

5 files changed

+145
-0
lines changed

5 files changed

+145
-0
lines changed

sdk/android/BUILD.gn

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,8 @@ if (is_android) {
536536
sources = [
537537
"api/org/webrtc/SoftwareVideoDecoderFactory.java",
538538
"api/org/webrtc/SoftwareVideoEncoderFactory.java",
539+
"api/org/webrtc/SimulcastVideoEncoder.java",
540+
"api/org/webrtc/SimulcastVideoEncoderFactory.java",
539541
]
540542

541543
deps = [
@@ -909,13 +911,29 @@ if (current_os == "linux" || is_android) {
909911
]
910912
}
911913

914+
rtc_library("simulcast_jni") {
915+
visibility = [ "*" ]
916+
allow_poison = [ "software_video_codecs" ]
917+
sources = [
918+
"src/jni/simulcast_video_encoder.cc",
919+
"src/jni/simulcast_video_encoder.h"
920+
]
921+
deps = [
922+
":base_jni",
923+
":video_jni",
924+
":native_api_codecs",
925+
"../../media:rtc_simulcast_encoder_adapter"
926+
]
927+
}
928+
912929
rtc_library("swcodecs_jni") {
913930
visibility = [ "*" ]
914931
allow_poison = [ "software_video_codecs" ]
915932
deps = [
916933
":libaom_av1_decoder_if_supported_jni",
917934
":libvpx_vp8_jni",
918935
":libvpx_vp9_jni",
936+
":simulcast_jni",
919937
]
920938
}
921939

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package org.webrtc;
2+
3+
public class SimulcastVideoEncoder extends WrappedNativeVideoEncoder {
4+
5+
static native long nativeCreateEncoder(VideoEncoderFactory primary, VideoEncoderFactory fallback, VideoCodecInfo info);
6+
7+
VideoEncoderFactory primary;
8+
VideoEncoderFactory fallback;
9+
VideoCodecInfo info;
10+
11+
public SimulcastVideoEncoder(VideoEncoderFactory primary, VideoEncoderFactory fallback, VideoCodecInfo info) {
12+
this.primary = primary;
13+
this.fallback = fallback;
14+
this.info = info;
15+
}
16+
17+
@Override
18+
public long createNativeVideoEncoder() {
19+
return nativeCreateEncoder(primary, fallback, info);
20+
}
21+
22+
@Override
23+
public boolean isHardwareEncoder() {
24+
return false;
25+
}
26+
27+
}
28+
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Copyright 2017 The WebRTC project authors. All Rights Reserved.
3+
*
4+
* Use of this source code is governed by a BSD-style license
5+
* that can be found in the LICENSE file in the root of the source
6+
* tree. An additional intellectual property rights grant can be found
7+
* in the file PATENTS. All contributing project authors may
8+
* be found in the AUTHORS file in the root of the source tree.
9+
*/
10+
11+
package org.webrtc;
12+
13+
import androidx.annotation.Nullable;
14+
import java.util.ArrayList;
15+
import java.util.HashMap;
16+
import java.util.List;
17+
import java.util.Arrays;
18+
19+
public class SimulcastVideoEncoderFactory implements VideoEncoderFactory {
20+
21+
VideoEncoderFactory primary;
22+
VideoEncoderFactory fallback;
23+
24+
public SimulcastVideoEncoderFactory(VideoEncoderFactory primary, VideoEncoderFactory fallback) {
25+
this.primary = primary;
26+
this.fallback = fallback;
27+
}
28+
29+
@Nullable
30+
@Override
31+
public VideoEncoder createEncoder(VideoCodecInfo info) {
32+
return new SimulcastVideoEncoder(primary, fallback, info);
33+
}
34+
35+
@Override
36+
public VideoCodecInfo[] getSupportedCodecs() {
37+
List<VideoCodecInfo> codecs = new ArrayList<VideoCodecInfo>();
38+
codecs.addAll(Arrays.asList(primary.getSupportedCodecs()));
39+
codecs.addAll(Arrays.asList(fallback.getSupportedCodecs()));
40+
return codecs.toArray(new VideoCodecInfo[codecs.size()]);
41+
}
42+
43+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
#include <jni.h>
2+
3+
#include "sdk/android/src/jni/jni_helpers.h"
4+
#include "sdk/android/src/jni/video_encoder_factory_wrapper.h"
5+
#include "sdk/android/src/jni/video_codec_info.h"
6+
#include "sdk/android/native_api/codecs/wrapper.h"
7+
#include "media/engine/simulcast_encoder_adapter.h"
8+
#include "rtc_base/logging.h"
9+
10+
using namespace webrtc;
11+
using namespace webrtc::jni;
12+
13+
#ifdef __cplusplus
14+
extern "C" {
15+
#endif
16+
17+
// (VideoEncoderFactory primary, VideoEncoderFactory fallback, VideoCodecInfo info)
18+
JNIEXPORT jlong JNICALL Java_org_webrtc_SimulcastVideoEncoder_nativeCreateEncoder(JNIEnv *env, jclass klass, jobject primary, jobject fallback, jobject info) {
19+
RTC_LOG(LS_INFO) << "Create simulcast video encoder";
20+
JavaParamRef<jobject> info_ref(info);
21+
SdpVideoFormat format = VideoCodecInfoToSdpVideoFormat(env, info_ref);
22+
23+
// TODO: 影響は軽微だが、リークする可能性があるので将来的に修正したい
24+
// https://github.com/shiguredo-webrtc-build/webrtc-build/pull/16#pullrequestreview-600675795
25+
return NativeToJavaPointer(std::make_unique<SimulcastEncoderAdapter>(
26+
JavaToNativeVideoEncoderFactory(env, primary).release(),
27+
JavaToNativeVideoEncoderFactory(env, fallback).release(),
28+
format).release());
29+
}
30+
31+
32+
#ifdef __cplusplus
33+
}
34+
#endif

sdk/android/src/jni/simulcast_video_encoder.h

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)