Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions RTCUtil.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
'use strict';

import { NativeModules } from 'react-native';

const { WebRTCModule } = NativeModules;

/**
* Internal util for deep clone object. Object.assign() only does a shallow copy
*
Expand Down Expand Up @@ -33,3 +37,15 @@ export function mergeMediaConstraints(custom, def) {
}
return constraints;
}

export function enableSoftwareAEC() {
if(WebRTCModule?.enableSoftwareAEC) {
WebRTCModule?.enableSoftwareAEC()
}
}

export function disableSoftwareAEC() {
if(WebRTCModule?.disableSoftwareAEC) {
WebRTCModule?.disableSoftwareAEC()
}
}
1 change: 1 addition & 0 deletions android/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,6 @@ android {

dependencies {
implementation 'com.facebook.react:react-native:+'
api 'com.bugsnag:bugsnag-android:5.2.2'
api fileTree(dir: 'libs', include: ['*.jar'])
}
Binary file modified android/libs/libjingle_peerconnection.so.jar
Binary file not shown.
Binary file modified android/libs/libwebrtc.jar
Binary file not shown.
18 changes: 18 additions & 0 deletions android/src/main/java/com/oney/WebRTCModule/ThreadUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.bugsnag.android.Bugsnag;

final class ThreadUtils {
/**
Expand All @@ -19,4 +20,21 @@ final class ThreadUtils {
public static void runOnExecutor(Runnable runnable) {
executor.execute(runnable);
}

public static void addExceptionHandlerForThread(Thread.UncaughtExceptionHandler h, String threadName) {
boolean foundAThread = false;
for (Thread t : Thread.getAllStackTraces().keySet()) {
if (t.getName().equals(threadName) && t.isAlive()) {
foundAThread = true;
t.setUncaughtExceptionHandler(h);
}
}
if (!foundAThread) {
try {
Bugsnag.notify(new IllegalAccessError("Thread not found in webrtc: " + threadName));
} catch (Exception exception) {
exception.printStackTrace();
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import java.util.concurrent.CountDownLatch;

import org.webrtc.EglBase;
import org.webrtc.EglError;
import org.webrtc.EglRenderer;
import org.webrtc.EglRenderer.FrameListener;
import org.webrtc.GlRectDrawer;
Expand Down Expand Up @@ -43,9 +44,9 @@ public class UnSurfaceViewRenderer extends SurfaceView implements Callback, Vide
private int surfaceWidth;
private int surfaceHeight;

public UnSurfaceViewRenderer(Context context) {
public UnSurfaceViewRenderer(Context context, EglError eglError) {
super(context);
this.eglRenderer = new EglRenderer(this.resourceName);
this.eglRenderer = new EglRenderer(this.resourceName, eglError);
this.getHolder().addCallback(this);
// this.setZOrderMediaOverlay(true);
// this.getHolder().setFormat(PixelFormat.TRANSPARENT);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,29 @@
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import androidx.core.view.ViewCompat;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.util.Log;
import android.widget.Toast;

import com.facebook.react.bridge.ReactContext;
import androidx.core.view.ViewCompat;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;
import com.bugsnag.android.Bugsnag;
import com.bugsnag.android.Severity;
import com.facebook.react.bridge.ReactContext;

import org.webrtc.EglBase;
import org.webrtc.EglError;
import org.webrtc.MediaStream;
import org.webrtc.RendererCommon;
import org.webrtc.RendererCommon.RendererEvents;
import org.webrtc.RendererCommon.ScalingType;
import org.webrtc.VideoTrack;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

public class WebRTCGreenScreenView extends ViewGroup {
/**
* The scaling type to be utilized by default.
Expand Down Expand Up @@ -168,7 +173,20 @@ public void run() {

public WebRTCGreenScreenView(Context context) {
super(context);
surfaceViewRenderer = new UnSurfaceViewRenderer(getContext());
surfaceViewRenderer = new UnSurfaceViewRenderer(getContext(), new EglError() {
@Override
public void onSurfaceCreationFailed(Exception e) {
Toast.makeText(context, "Error in loading video. Please reopen the class", Toast.LENGTH_LONG).show();
try {
Bugsnag.notify(e, event -> {
event.setSeverity(Severity.INFO);
return true;
});
} catch (Exception exception) {
exception.printStackTrace();
}
}
});
addView(surfaceViewRenderer);
setMirror(true);
setScalingType(DEFAULT_SCALING_TYPE);
Expand Down
48 changes: 45 additions & 3 deletions android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,22 @@
import java.util.Map;

import org.webrtc.*;
import org.webrtc.audio.AudioDeviceModule;
import org.webrtc.audio.JavaAudioDeviceModule;
import org.webrtc.voiceengine.WebRtcAudioUtils;

@ReactModule(name = "WebRTCModule")
public class WebRTCModule extends ReactContextBaseJavaModule {
static final String TAG = WebRTCModule.class.getCanonicalName();

PeerConnectionFactory mFactory;
PeerConnectionFactory mFactory1;

private final SparseArray<PeerConnectionObserver> mPeerConnectionObservers;
final Map<String, MediaStream> localStreams;

private boolean enableSoftwareBasedNoiseCancellation = false;

/**
* The implementation of {@code getUserMedia} extracted into a separate file
* in order to reduce complexity and to (somewhat) separate concerns.
Expand Down Expand Up @@ -77,13 +84,26 @@ private void initAsync() {
}

mFactory
= PeerConnectionFactory.builder()
= PeerConnectionFactory.builder()
.setVideoEncoderFactory(encoderFactory)
.setVideoDecoderFactory(decoderFactory)
.createPeerConnectionFactory();

AudioDeviceModule adm = JavaAudioDeviceModule.builder(reactContext)
.setUseHardwareAcousticEchoCanceler(false)
.setUseHardwareNoiseSuppressor(false)
.createAudioDeviceModule();

mFactory1
= PeerConnectionFactory.builder()
.setAudioDeviceModule(adm)
.setVideoEncoderFactory(encoderFactory)
.setVideoDecoderFactory(decoderFactory)
.createPeerConnectionFactory();

if (eglContext != null) {
mFactory.setVideoHwAccelerationOptions(eglContext, eglContext);
mFactory1.setVideoHwAccelerationOptions(eglContext, eglContext);
}

getUserMediaImpl = new GetUserMediaImpl(this, reactContext);
Expand Down Expand Up @@ -347,6 +367,22 @@ private PeerConnection.RTCConfiguration parseRTCConfiguration(ReadableMap map) {
return conf;
}

@ReactMethod
public void enableSoftwareAEC() {
enableSoftwareBasedNoiseCancellation = true;
WebRtcAudioUtils.setWebRtcBasedAutomaticGainControl(true);
WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(true);
WebRtcAudioUtils.setWebRtcBasedNoiseSuppressor(true);
}

@ReactMethod
public void disableSoftwareAEC() {
enableSoftwareBasedNoiseCancellation = false;
WebRtcAudioUtils.setWebRtcBasedAutomaticGainControl(false);
WebRtcAudioUtils.setWebRtcBasedAcousticEchoCanceler(false);
WebRtcAudioUtils.setWebRtcBasedNoiseSuppressor(false);
}

@ReactMethod
public void peerConnectionInit(ReadableMap configuration, int id) {
PeerConnection.RTCConfiguration rtcConfiguration
Expand All @@ -360,8 +396,14 @@ private void peerConnectionInitAsync(
PeerConnection.RTCConfiguration configuration,
int id) {
PeerConnectionObserver observer = new PeerConnectionObserver(this, id);
PeerConnection peerConnection
= mFactory.createPeerConnection(configuration, observer);

PeerConnection peerConnection;
if(enableSoftwareBasedNoiseCancellation) {
peerConnection = mFactory1.createPeerConnection(configuration, observer);
} else {
peerConnection = mFactory.createPeerConnection(configuration, observer);
}


observer.setPeerConnection(peerConnection);
mPeerConnectionObservers.put(id, observer);
Expand Down
20 changes: 19 additions & 1 deletion android/src/main/java/com/oney/WebRTCModule/WebRTCView.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
package com.oney.WebRTCModule;

import android.annotation.SuppressLint;
import android.content.res.Resources;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import androidx.core.view.ViewCompat;
import android.view.View;
import android.view.ViewGroup;
import android.util.Log;
import android.widget.Toast;

import com.bugsnag.android.Bugsnag;
import com.bugsnag.android.Severity;
import com.facebook.react.bridge.ReactContext;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import org.webrtc.EglBase;
import org.webrtc.EglError;
import org.webrtc.MediaStream;
import org.webrtc.RendererCommon;
import org.webrtc.RendererCommon.RendererEvents;
Expand Down Expand Up @@ -168,7 +173,20 @@ public void run() {
public WebRTCView(Context context) {
super(context);

surfaceViewRenderer = new SurfaceViewRenderer(context);
surfaceViewRenderer = new SurfaceViewRenderer(context, new EglError() {
@Override
public void onSurfaceCreationFailed(Exception e) {
Toast.makeText(context, "Error in loading video. Please reopen the class", Toast.LENGTH_LONG).show();
try {
Bugsnag.notify(e, event -> {
event.setSeverity(Severity.INFO);
return true;
});
} catch (Exception exception) {
exception.printStackTrace();
}
}
});
addView(surfaceViewRenderer);

setMirror(false);
Expand Down
5 changes: 4 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import MediaStreamTrack from './MediaStreamTrack';
import mediaDevices from './MediaDevices';
import permissions from './Permissions';
import GreenScreenView from './GreenScreenView'
import { enableSoftwareAEC, disableSoftwareAEC } from './RTCUtil'

export {
RTCPeerConnection,
Expand All @@ -19,5 +20,7 @@ export {
MediaStreamTrack,
mediaDevices,
permissions,
GreenScreenView
GreenScreenView,
enableSoftwareAEC,
disableSoftwareAEC,
};