Allow passing in a custom native library loader.
All previous initialize methods are deprecated and a new initialize that uses a builder pattern is added. This gives us full control over the order of initialization. Bug: webrtc:7474 Change-Id: I006190e50f2e75c5015f0be75b86d367676db2cc Reviewed-on: https://webrtc-review.googlesource.com/4160 Reviewed-by: Magnus Jedvert <magjed@webrtc.org> Commit-Queue: Sami Kalliomäki <sakal@webrtc.org> Cr-Commit-Position: refs/heads/master@{#20037}
This commit is contained in:
committed by
Commit Bot
parent
7bcfc3b232
commit
5cd1cfb7c4
@ -18,15 +18,10 @@ import java.util.List;
|
||||
* the PeerConnection API for clients.
|
||||
*/
|
||||
public class PeerConnectionFactory {
|
||||
private static volatile boolean nativeLibLoaded;
|
||||
|
||||
static {
|
||||
try {
|
||||
System.loadLibrary("jingle_peerconnection_so");
|
||||
nativeLibLoaded = true;
|
||||
} catch (UnsatisfiedLinkError t) {
|
||||
nativeLibLoaded = false;
|
||||
}
|
||||
// TODO(sakal): Remove once all dependencies have started using
|
||||
// PeerConnectionFactory.initialize.
|
||||
NativeLibrary.initialize(new NativeLibrary.DefaultLoader());
|
||||
}
|
||||
|
||||
public static final String TRIAL_ENABLED = "Enabled";
|
||||
@ -42,6 +37,65 @@ public class PeerConnectionFactory {
|
||||
private EglBase localEglbase;
|
||||
private EglBase remoteEglbase;
|
||||
|
||||
public static class InitializationOptions {
|
||||
final Context applicationContext;
|
||||
final String fieldTrials;
|
||||
final boolean enableInternalTracer;
|
||||
final boolean enableVideoHwAcceleration;
|
||||
final NativeLibraryLoader nativeLibraryLoader;
|
||||
|
||||
private InitializationOptions(Context applicationContext, String fieldTrials,
|
||||
boolean enableInternalTracer, boolean enableVideoHwAcceleration,
|
||||
NativeLibraryLoader nativeLibraryLoader) {
|
||||
this.applicationContext = applicationContext;
|
||||
this.fieldTrials = fieldTrials;
|
||||
this.enableInternalTracer = enableInternalTracer;
|
||||
this.enableVideoHwAcceleration = enableVideoHwAcceleration;
|
||||
this.nativeLibraryLoader = nativeLibraryLoader;
|
||||
}
|
||||
|
||||
public static Builder builder(Context applicationContext) {
|
||||
return new Builder(applicationContext);
|
||||
}
|
||||
|
||||
public static class Builder {
|
||||
private final Context applicationContext;
|
||||
private String fieldTrials = "";
|
||||
private boolean enableInternalTracer = true;
|
||||
private boolean enableVideoHwAcceleration = true;
|
||||
private NativeLibraryLoader nativeLibraryLoader = new NativeLibrary.DefaultLoader();
|
||||
|
||||
Builder(Context applicationContext) {
|
||||
this.applicationContext = applicationContext;
|
||||
}
|
||||
|
||||
public Builder setFieldTrials(String fieldTrials) {
|
||||
this.fieldTrials = fieldTrials;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setEnableInternalTracer(boolean enableInternalTracer) {
|
||||
this.enableInternalTracer = enableInternalTracer;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setEnableVideoHwAcceleration(boolean enableVideoHwAcceleration) {
|
||||
this.enableVideoHwAcceleration = enableVideoHwAcceleration;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder setNativeLibraryLoader(NativeLibraryLoader nativeLibraryLoader) {
|
||||
this.nativeLibraryLoader = nativeLibraryLoader;
|
||||
return this;
|
||||
}
|
||||
|
||||
public PeerConnectionFactory.InitializationOptions createInitializationOptions() {
|
||||
return new PeerConnectionFactory.InitializationOptions(applicationContext, fieldTrials,
|
||||
enableInternalTracer, enableVideoHwAcceleration, nativeLibraryLoader);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static class Options {
|
||||
// Keep in sync with webrtc/rtc_base/network.h!
|
||||
static final int ADAPTER_TYPE_UNKNOWN = 0;
|
||||
@ -56,17 +110,35 @@ public class PeerConnectionFactory {
|
||||
public boolean disableNetworkMonitor;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads and initializes WebRTC. This must be called at least once before creating a
|
||||
* PeerConnectionFactory. Replaces all the old initialization methods. Must not be called while
|
||||
* a PeerConnectionFactory is alive.
|
||||
*/
|
||||
public static void initialize(InitializationOptions options) {
|
||||
ContextUtils.initialize(options.applicationContext);
|
||||
NativeLibrary.initialize(options.nativeLibraryLoader);
|
||||
nativeInitializeAndroidGlobals(options.applicationContext, options.enableVideoHwAcceleration);
|
||||
initializeFieldTrials(options.fieldTrials);
|
||||
if (options.enableInternalTracer) {
|
||||
initializeInternalTracer();
|
||||
}
|
||||
}
|
||||
|
||||
// Must be called at least once before creating a PeerConnectionFactory
|
||||
// (for example, at application startup time).
|
||||
public static native void nativeInitializeAndroidGlobals(
|
||||
private static native void nativeInitializeAndroidGlobals(
|
||||
Context context, boolean videoHwAcceleration);
|
||||
|
||||
// Deprecated, use PeerConnectionFactory.initialize instead.
|
||||
@Deprecated
|
||||
public static void initializeAndroidGlobals(Context context, boolean videoHwAcceleration) {
|
||||
ContextUtils.initialize(context);
|
||||
nativeInitializeAndroidGlobals(context, videoHwAcceleration);
|
||||
}
|
||||
|
||||
// Older signature of initializeAndroidGlobals. The extra parameters are now meaningless.
|
||||
// Deprecated, use PeerConnectionFactory.initialize instead.
|
||||
@Deprecated
|
||||
public static boolean initializeAndroidGlobals(Object context, boolean initializeAudio,
|
||||
boolean initializeVideo, boolean videoHwAcceleration) {
|
||||
@ -76,7 +148,8 @@ public class PeerConnectionFactory {
|
||||
|
||||
// Field trial initialization. Must be called before PeerConnectionFactory
|
||||
// is created.
|
||||
public static native void initializeFieldTrials(String fieldTrialsInitString);
|
||||
// Deprecated, use PeerConnectionFactory.initialize instead.
|
||||
@Deprecated public static native void initializeFieldTrials(String fieldTrialsInitString);
|
||||
// Wrapper of webrtc::field_trial::FindFullName. Develop the feature with default behaviour off.
|
||||
// Example usage:
|
||||
// if (PeerConnectionFactory.fieldTrialsFindFullName("WebRTCExperiment").equals("Enabled")) {
|
||||
@ -85,12 +158,13 @@ public class PeerConnectionFactory {
|
||||
// method2();
|
||||
// }
|
||||
public static String fieldTrialsFindFullName(String name) {
|
||||
return nativeLibLoaded ? nativeFieldTrialsFindFullName(name) : "";
|
||||
return NativeLibrary.isLoaded() ? nativeFieldTrialsFindFullName(name) : "";
|
||||
}
|
||||
private static native String nativeFieldTrialsFindFullName(String name);
|
||||
// Internal tracing initialization. Must be called before PeerConnectionFactory is created to
|
||||
// prevent racing with tracing code.
|
||||
public static native void initializeInternalTracer();
|
||||
// Deprecated, use PeerConnectionFactory.initialize instead.
|
||||
@Deprecated public static native void initializeInternalTracer();
|
||||
// Internal tracing shutdown, called to prevent resource leaks. Must be called after
|
||||
// PeerConnectionFactory is gone to prevent races with code performing tracing.
|
||||
public static native void shutdownInternalTracer();
|
||||
@ -111,6 +185,11 @@ public class PeerConnectionFactory {
|
||||
|
||||
public PeerConnectionFactory(
|
||||
Options options, VideoEncoderFactory encoderFactory, VideoDecoderFactory decoderFactory) {
|
||||
if (!NativeLibrary.isLoaded() || ContextUtils.getApplicationContext() == null) {
|
||||
throw new IllegalStateException(
|
||||
"PeerConnectionFactory.initialize was not called before creating a "
|
||||
+ "PeerConnectionFactory.");
|
||||
}
|
||||
nativeFactory = nativeCreatePeerConnectionFactory(options, encoderFactory, decoderFactory);
|
||||
if (nativeFactory == 0) {
|
||||
throw new RuntimeException("Failed to initialize PeerConnectionFactory!");
|
||||
|
||||
Reference in New Issue
Block a user