package im.actor.runtime.android.webrtc; import org.webrtc.MediaConstraints; import org.webrtc.VideoCapturer; import org.webrtc.VideoSource; import im.actor.runtime.android.AndroidWebRTCRuntimeProvider; public class AndroidVideoSource { private static final Object LOCK = new Object(); private static AndroidVideoSource currentSource; public static AndroidVideoSource pickVideoSource() { synchronized (LOCK) { if (currentSource != null) { currentSource.count++; return currentSource; } currentSource = new AndroidVideoSource(); return currentSource; } } private int count; private boolean isReleased; private VideoCapturer videoCapturer; private VideoSource videoSource; public AndroidVideoSource() { this.count = 1; this.isReleased = false; this.videoCapturer = getVideoCapturer(); this.videoSource = AndroidWebRTCRuntimeProvider.FACTORY.createVideoSource(this.videoCapturer, new MediaConstraints()); } public int getCount() { return count; } public boolean isReleased() { return isReleased; } public VideoSource getVideoSource() { return videoSource; } public void unlink() { synchronized (LOCK) { count--; if (count == 0) { if (AndroidVideoSource.currentSource == this) { AndroidVideoSource.currentSource = null; videoSource.dispose(); // videoSource.dispose(); // videoCapturer.dispose(); } } } } // Cycle through likely device names for the camera and return the first // capturer that works, or crash if none do. private VideoCapturer getVideoCapturer() { String[] cameraFacing = {"front", "back"}; int[] cameraIndex = {0, 1}; int[] cameraOrientation = {0, 90, 180, 270}; for (String facing : cameraFacing) { for (int index : cameraIndex) { for (int orientation : cameraOrientation) { String name = "Camera " + index + ", Facing " + facing + ", Orientation " + orientation; VideoCapturer capturer = VideoCapturer.create(name); if (capturer != null) { return capturer; } } } } throw new RuntimeException("Failed to open capturer"); } }