summaryrefslogtreecommitdiffstats
path: root/dom/media/systemservices
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/systemservices')
-rw-r--r--dom/media/systemservices/android_video_capture/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java35
-rw-r--r--dom/media/systemservices/android_video_capture/video_capture_android.cc12
-rw-r--r--dom/media/systemservices/objc_video_capture/video_capture_avfoundation.mm5
3 files changed, 30 insertions, 22 deletions
diff --git a/dom/media/systemservices/android_video_capture/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java b/dom/media/systemservices/android_video_capture/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
index cc54009a7b..b4cc65ec9c 100644
--- a/dom/media/systemservices/android_video_capture/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
+++ b/dom/media/systemservices/android_video_capture/java/src/org/webrtc/videoengine/VideoCaptureAndroid.java
@@ -17,6 +17,7 @@ import android.content.Context;
import android.util.Log;
import android.view.Surface;
import android.view.WindowManager;
+import androidx.annotation.NonNull;
import java.util.concurrent.CountDownLatch;
@@ -37,10 +38,8 @@ public class VideoCaptureAndroid implements CameraVideoCapturer.CameraEventsHand
private final String deviceName;
private volatile long native_capturer; // |VideoCaptureAndroid*| in C++.
- private Context context;
+ private final Context context;
private CameraVideoCapturer cameraVideoCapturer;
- private EglBase eglBase;
- private SurfaceTextureHelper surfaceTextureHelper;
// This class is recreated everytime we start/stop capture, so we
// can safely create the CountDownLatches here.
@@ -48,8 +47,16 @@ public class VideoCaptureAndroid implements CameraVideoCapturer.CameraEventsHand
private boolean capturerStartedSucceeded = false;
private final CountDownLatch capturerStopped = new CountDownLatch(1);
- @WebRTCJNITarget
- public VideoCaptureAndroid(String deviceName) {
+ @WebRTCJNITarget
+ public static VideoCaptureAndroid create(@NonNull final String deviceName) {
+ final Context context = GetContext();
+ return new VideoCaptureAndroid(context, deviceName,
+ Camera2Enumerator.isSupported(context)
+ ? new Camera2Enumerator(context)
+ : new Camera1Enumerator());
+ }
+
+ private VideoCaptureAndroid(@NonNull final Context context, @NonNull final String deviceName, @NonNull final CameraEnumerator enumerator) {
// Remove the camera facing information from the name.
String[] parts = deviceName.split("Facing (front|back):");
if (parts.length == 2) {
@@ -58,20 +65,14 @@ public class VideoCaptureAndroid implements CameraVideoCapturer.CameraEventsHand
Log.e(TAG, "VideoCaptureAndroid: Expected facing mode as part of name: " + deviceName);
this.deviceName = deviceName;
}
- this.context = GetContext();
+ this.context = context;
- CameraEnumerator enumerator;
- if (Camera2Enumerator.isSupported(context)) {
- enumerator = new Camera2Enumerator(context);
- } else {
- enumerator = new Camera1Enumerator();
- }
try {
cameraVideoCapturer = enumerator.createCapturer(this.deviceName, this);
- eglBase = EglBase.create();
- surfaceTextureHelper = SurfaceTextureHelper.create("VideoCaptureAndroidSurfaceTextureHelper", eglBase.getEglBaseContext());
+ final EglBase eglBase = EglBase.create();
+ final SurfaceTextureHelper surfaceTextureHelper = SurfaceTextureHelper.create("VideoCaptureAndroidSurfaceTextureHelper", eglBase.getEglBaseContext());
cameraVideoCapturer.initialize(surfaceTextureHelper, context, this);
- } catch (java.lang.IllegalArgumentException e) {
+ } catch (java.lang.RuntimeException e) {
Log.e(TAG, "VideoCaptureAndroid: Exception while creating capturer: " + e);
}
}
@@ -80,6 +81,10 @@ public class VideoCaptureAndroid implements CameraVideoCapturer.CameraEventsHand
@WebRTCJNITarget
private static native Context GetContext();
+ public boolean canCapture() {
+ return cameraVideoCapturer != null;
+ }
+
// Called by native code. Returns true if capturer is started.
//
// Note that this actually opens the camera, and Camera callbacks run on the
diff --git a/dom/media/systemservices/android_video_capture/video_capture_android.cc b/dom/media/systemservices/android_video_capture/video_capture_android.cc
index da0715db27..cd5a73ceb6 100644
--- a/dom/media/systemservices/android_video_capture/video_capture_android.cc
+++ b/dom/media/systemservices/android_video_capture/video_capture_android.cc
@@ -177,12 +177,14 @@ int32_t VideoCaptureAndroid::Init(const char* deviceUniqueIdUTF8) {
AttachThreadScoped ats(g_jvm_capture);
JNIEnv* env = ats.env();
- jmethodID ctor = env->GetMethodID(g_java_capturer_class, "<init>",
- "(Ljava/lang/String;)V");
- assert(ctor);
+ jmethodID factory =
+ env->GetStaticMethodID(g_java_capturer_class, "create",
+ "(Ljava/lang/String;)"
+ "Lorg/webrtc/videoengine/VideoCaptureAndroid;");
+ assert(factory);
jstring j_deviceName = env->NewStringUTF(_deviceUniqueId);
- _jCapturer = env->NewGlobalRef(
- env->NewObject(g_java_capturer_class, ctor, j_deviceName));
+ _jCapturer = env->NewGlobalRef(env->CallStaticObjectMethod(
+ g_java_capturer_class, factory, j_deviceName));
assert(_jCapturer);
return 0;
}
diff --git a/dom/media/systemservices/objc_video_capture/video_capture_avfoundation.mm b/dom/media/systemservices/objc_video_capture/video_capture_avfoundation.mm
index 36d5f56b16..ca7bf4db9b 100644
--- a/dom/media/systemservices/objc_video_capture/video_capture_avfoundation.mm
+++ b/dom/media/systemservices/objc_video_capture/video_capture_avfoundation.mm
@@ -88,10 +88,11 @@ AVCaptureDeviceFormat* _Nullable FindFormat(
- (void)capturer:(RTCVideoCapturer* _Nonnull)capturer
didCaptureVideoFrame:(RTCVideoFrame* _Nonnull)frame {
- rtc::scoped_refptr<webrtc::videocapturemodule::VideoCaptureAvFoundation> cap;
+ webrtc::scoped_refptr<webrtc::videocapturemodule::VideoCaptureAvFoundation>
+ cap;
{
webrtc::MutexLock lock(&_mutex);
- cap = rtc::scoped_refptr(_capturer);
+ cap = webrtc::scoped_refptr(_capturer);
}
if (!cap) return;
cap->OnFrame(frame);