diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PcObserver.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PcObserver.java index 31e3e9fd..c422b13c 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PcObserver.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PcObserver.java @@ -20,6 +20,7 @@ import java.util.Objects; import java.util.function.BiConsumer; import java.util.function.Consumer; +import java.util.stream.Collectors; //TODO: Fix warnings public class PcObserver implements PeerConnection.Observer { @@ -31,17 +32,8 @@ public class PcObserver implements PeerConnection.Observer { private BiConsumer, RtpReceiver> onAddTrack; private Consumer onVideoTrack; - private Consumer onSignalingState; - private Consumer onPeerConnectionState; - private Consumer onIceGatheringState; - private Consumer onIceConnectionState; private Consumer onIceCandidate; - private Consumer onAddStream; - private Consumer onRemoveStream; - private Consumer onDataChannel; - private Runnable onRenegotiationNeeded; - private Consumer onTrack; - private Consumer onRemoveTrack; + private final Map streamIdsByTracks = new HashMap<>(); public PcObserver( PeerConnectionFactory peerConnectionFactory, @@ -55,21 +47,6 @@ public PcObserver( this.onIceCandidate = onIceCandidate; } - public PcObserver( - PeerConnectionFactory peerConnectionFactory, - PmxKeyStore store, - TrackObserver observer - ) { - this(peerConnectionFactory, store, observer,null); - } - - public PcObserver( - PeerConnectionFactory peerConnectionFactory, - PmxKeyStore store - ) { - this(peerConnectionFactory, store, null,null); - } - public void setOnAddTrack(BiConsumer, RtpReceiver> onAddTrack) { this.onAddTrack = onAddTrack; } @@ -109,9 +86,7 @@ public void onIceCandidatesRemoved(IceCandidate[] iceCandidates) { } @Override - public void onAddStream(MediaStream mediaStream) { - - } + public void onAddStream(MediaStream mediaStream) {} @Override public void onRemoveStream(MediaStream mediaStream) { @@ -130,31 +105,39 @@ public void onRenegotiationNeeded() { @Override public void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams) { - if (peerConnectionFactory != null && receiver.track() != null && receiver.track().id().equals(null)) { + MediaStreamTrack track = receiver.track(); + if(track != null && mediaStreams.length > 0) { + streamIdsByTracks.put(track.id(), mediaStreams[0].getId()); + } + } + + @Override + public void onTrack(RtpTransceiver transceiver) { + RtpReceiver rtpReceiver = transceiver.getReceiver(); + MediaStreamTrack track = rtpReceiver.track(); + if (peerConnectionFactory != null && track != null && track.id() != null) { frameCryptorMap.put( - receiver.track().id(), + track.id(), PmxFrameCryptorFactory.createPmxFrameCryptorForRtpReceiver( peerConnectionFactory, - receiver, + rtpReceiver, keyStore ) ); - } - if (onAddTrack != null) { - onAddTrack.accept(Arrays.asList(mediaStreams), receiver); - - if (Objects.equals(receiver.track().kind(), MediaStreamTrack.VIDEO_TRACK_KIND)) { - onVideoTrack.accept(receiver.track().id()); + if(trackObserver != null){ + String streamId = streamIdsByTracks.get(track.id()); + if(streamId != null) { + trackObserver.OnRemoteTrack(streamId, track); + } } } } @Override - public void onTrack(RtpTransceiver transceiver) { - RtpReceiver rtpReceiver = transceiver.getReceiver(); - MediaStreamTrack track = rtpReceiver.track(); - if (trackObserver != null) trackObserver.onTrack(track); - PmxFrameCryptorFactory.createPmxFrameCryptorForRtpReceiver(peerConnectionFactory, rtpReceiver, keyStore); + public void onRemoveTrack(RtpReceiver receiver) { + //TODO: cleanup track cryptors (?) +// onRemoveTrack.accept(receiver.track()); + receiver.dispose(); } public void setFrameCryptorOptions(PmxFrameCryptor.PmxFrameCryptorOptions options) { diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PeerConnectionManager.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PeerConnectionManager.java index 39e4b67f..212d0114 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PeerConnectionManager.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/PeerConnectionManager.java @@ -16,13 +16,13 @@ import java.util.function.BiConsumer; import java.util.function.Function; -public class PeerConnectionManager { +class PeerConnectionManager { private final Map sessions = new HashMap<>(); private final Map sessionHandles = new HashMap<>(); - private final PeerConnectionFactory pcFactory; + protected final PeerConnectionFactory pcFactory; private final BiConsumer onTrickle; - public PeerConnectionManager( + PeerConnectionManager( PeerConnectionFactory pcFactory, BiConsumer onTrickle ) { @@ -31,9 +31,9 @@ public PeerConnectionManager( } @NonNull - public RoomJanusSession createSession(@NonNull String streamRoomId, TrackObserver defaultTrackObserver) { + public RoomJanusSession createSession(@NonNull String streamRoomId) { return Optional.ofNullable( - sessions.putIfAbsent(streamRoomId, new RoomJanusSession(streamRoomId, pcFactory, defaultTrackObserver, onTrickle)) + sessions.putIfAbsent(streamRoomId, new RoomJanusSession(streamRoomId, pcFactory, onTrickle)) ).orElse(Objects.requireNonNull(sessions.get(streamRoomId))); } diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/RoomJanusSession.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/RoomJanusSession.java index 60d3ef08..99246297 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/RoomJanusSession.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/RoomJanusSession.java @@ -15,7 +15,10 @@ import org.webrtc.PmxKeyStore; import java.util.Collections; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.function.BiConsumer; @@ -33,14 +36,14 @@ public class RoomJanusSession { private final PmxKeyStore keyStore; public final WebRTCImpl webrtc = new WebRTCImpl(); private final BiConsumer onTrickle; - private final TrackObserver defaultTrackObserver; + private final Map trackObserversByStreamId = new HashMap<>(); + private final TrackObserver trackObserver = new TrackObserverImpl(); //TODO: Add error listener for catch errors from webrtcInterface - public RoomJanusSession(@NonNull String roomId, @NonNull PeerConnectionFactory pcFactory, TrackObserver defaultTrackObserver, BiConsumer onTrickle) { + public RoomJanusSession(@NonNull String roomId, @NonNull PeerConnectionFactory pcFactory, BiConsumer onTrickle) { this.pcFactory = pcFactory; this.roomID = roomId; this.keyStore = PmxFrameCryptorFactory.createPmxKeyStore(); - this.defaultTrackObserver = defaultTrackObserver; this.onTrickle = onTrickle; } @@ -55,7 +58,7 @@ public synchronized JanusPublisher getPublisher() { } public synchronized void createSubscriber() { - createSubscriber(defaultTrackObserver); + createSubscriber(trackObserver); } public synchronized void createSubscriber(TrackObserver observer) { @@ -70,7 +73,7 @@ public synchronized void createSubscriber(TrackObserver observer) { } public synchronized void createPublisher() { - createPublisher(defaultTrackObserver); + createPublisher(null); } public synchronized void createPublisher(TrackObserver observer) { @@ -84,6 +87,30 @@ public synchronized void createPublisher(TrackObserver observer) { } } + public void setTrackObserver( + TrackObserver trackObserver + ){ + setTrackObserver(null,trackObserver); + } + + public void setTrackObserver( + String streamId, + TrackObserver trackObserver + ){ + synchronized (trackObserversByStreamId) { + trackObserversByStreamId.put(streamId, trackObserver); + } + } + + public void setFrameCryptorOptions(PmxFrameCryptor.PmxFrameCryptorOptions options) { + if(subscriber != null){ + subscriber.setFrameCryptorOptions(options); + } + if(publisher != null){ + publisher.setFrameCryptorOptions(options); + } + } + public class WebRTCImpl implements WebRTCInterface { private final ExecutorService executor = Executors.newSingleThreadExecutor(); @@ -171,14 +198,18 @@ public void updateSessionId(String streamRoomId, Long sessionId, String connecti } } } - - - public void setFrameCryptorOptions(PmxFrameCryptor.PmxFrameCryptorOptions options) { - if(subscriber != null){ - subscriber.setFrameCryptorOptions(options); - } - if(publisher != null){ - publisher.setFrameCryptorOptions(options); + private class TrackObserverImpl implements TrackObserver{ + @Override + public void OnRemoteTrack(String streamId, MediaStreamTrack track) { + synchronized (trackObserversByStreamId){ + Optional.ofNullable(trackObserversByStreamId.get(streamId)).ifPresent(observer->{ + observer.OnRemoteTrack(streamId,track); + }); + + Optional.ofNullable(trackObserversByStreamId.get(null)).ifPresent(observer->{ + observer.OnRemoteTrack(streamId,track); + }); + } } } } diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java index 1557c700..94511fb1 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/StreamApi.java @@ -1,56 +1,37 @@ package com.simplito.java.privmx_endpoint.modules.stream; -import static android.media.AudioManager.GET_DEVICES_OUTPUTS; - import android.content.Context; -import android.media.AudioManager; -import android.media.AudioRecordingConfiguration; -import android.util.DisplayMetrics; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.simplito.java.privmx_endpoint.model.ContainerPolicy; -import com.simplito.java.privmx_endpoint.model.DeviceType; -import com.simplito.java.privmx_endpoint.model.MediaDevice; import com.simplito.java.privmx_endpoint.model.PagingList; import com.simplito.java.privmx_endpoint.model.Settings; import com.simplito.java.privmx_endpoint.model.StreamHandle; import com.simplito.java.privmx_endpoint.model.StreamInfo; import com.simplito.java.privmx_endpoint.model.StreamPublishResult; import com.simplito.java.privmx_endpoint.model.StreamRoom; -import com.simplito.java.privmx_endpoint.model.StreamSettings; import com.simplito.java.privmx_endpoint.model.StreamSubscription; import com.simplito.java.privmx_endpoint.model.UserWithPubKey; import com.simplito.java.privmx_endpoint.model.events.eventSelectorTypes.StreamEventSelectorType; import com.simplito.java.privmx_endpoint.model.events.eventTypes.StreamEventType; -import org.webrtc.AudioSource; import org.webrtc.AudioTrack; -import org.webrtc.Camera1Enumerator; -import org.webrtc.Camera2Enumerator; -import org.webrtc.CameraEnumerator; import org.webrtc.DefaultVideoDecoderFactory; import org.webrtc.DefaultVideoEncoderFactory; import org.webrtc.EglBase; -import org.webrtc.Logging; -import org.webrtc.MediaConstraints; import org.webrtc.MediaStreamTrack; import org.webrtc.PeerConnectionFactory; import org.webrtc.PmxFrameCryptor; -import org.webrtc.SurfaceTextureHelper; -import org.webrtc.VideoCapturer; import org.webrtc.VideoDecoderFactory; import org.webrtc.VideoEncoderFactory; -import org.webrtc.VideoSink; -import org.webrtc.VideoSource; import org.webrtc.VideoTrack; import org.webrtc.audio.AudioDeviceModule; import org.webrtc.audio.JavaAudioDeviceModule; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -66,6 +47,7 @@ public class StreamApi { private final EglBase rootEglBase; private final StreamApiLow api; private final PeerConnectionManager pcManager; + public final TrackFactory trackFactory; private static PeerConnectionFactory DefaultPeerConnectionFactory( Context appContext, @@ -123,11 +105,12 @@ public StreamApi( } pcManager = new PeerConnectionManager( factory, - (sessionId, rtcConfiguration)->{ - if(sessionId != null) { + (sessionId, rtcConfiguration) -> { + if (sessionId != null) { this.api.trickle(sessionId, rtcConfiguration); } }); + trackFactory = new TrackFactory(pcManager); } public String createStreamRoom( @@ -179,10 +162,10 @@ public List listStreams(String streamRoomId) { } public void joinStreamRoom( - String streamRoomId, - TrackObserver trackObserver + String streamRoomId ) { - RoomJanusSession session = pcManager.createSession(streamRoomId,trackObserver); + //TODO: Rollback this change, it is do only for run test + RoomJanusSession session = pcManager.createSession(streamRoomId); api.joinStreamRoom(streamRoomId, session.webrtc); } @@ -193,10 +176,11 @@ public void leaveStreamRoom(String streamRoomId) { public StreamHandle createStream(String streamRoomId) { RoomJanusSession session = pcManager.getSession(streamRoomId); - if(session == null) throw new IllegalStateException("Session to this room is not exsists. Call joinStreamRoom first"); + if (session == null) + throw new IllegalStateException("Session to this room is not exists. Call joinStreamRoom first"); try { session.createPublisher(); - }catch (IllegalStateException e){ + } catch (IllegalStateException e) { throw new IllegalStateException("Publisher is now active, try use modifyRemoteStreamsSubscriptions"); } @@ -205,220 +189,51 @@ public StreamHandle createStream(String streamRoomId) { return handle; } - // - public List getMediaDevices() { - List result = new ArrayList<>(); - - AudioManager audioManager = (AudioManager) appContext.getSystemService(Context.AUDIO_SERVICE); - CameraEnumerator videoManager; - - android.media.AudioDeviceInfo[] audioDevices = audioManager.getDevices(GET_DEVICES_OUTPUTS); - if (Camera2Enumerator.isSupported(appContext)) { - videoManager = new Camera2Enumerator(appContext); - } else { - videoManager = new Camera1Enumerator(true); - } - String[] videoDevices = videoManager.getDeviceNames(); - - audioManager.getActiveRecordingConfigurations().forEach(AudioRecordingConfiguration::getAudioDevice); - - List audio = Arrays.stream(audioDevices).map(it -> - new MediaDevice( - it.getProductName().toString(), - String.valueOf(it.getId()), - DeviceType.Audio - ) - ).collect(Collectors.toList()); - result.addAll(audio); - - List video = Arrays.stream(videoDevices).map(it -> - new MediaDevice( - it, - it, // todo: what else can it be? - DeviceType.Audio - ) - ).collect(Collectors.toList()); - result.addAll(video); - - return result; - } - - private VideoCapturer createCameraCapturer(CameraEnumerator enumerator) { - final String[] deviceNames = enumerator.getDeviceNames(); - - // First, try to find front facing camera - Logging.d(TAG, "Looking for front facing cameras."); - for (String deviceName : deviceNames) { - if (enumerator.isFrontFacing(deviceName)) { - Logging.d(TAG, "Creating front facing camera capturer."); - VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null); - - if (videoCapturer != null) { - return videoCapturer; - } - } - } - - // Front facing camera not found, try something else - Logging.d(TAG, "Looking for other cameras."); - for (String deviceName : deviceNames) { - if (!enumerator.isFrontFacing(deviceName)) { - Logging.d(TAG, "Creating other camera capturer."); - VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null); - - if (videoCapturer != null) { - return videoCapturer; - } - } - } - - return null; - } - - - private VideoCapturer createCameraCapturer(CameraEnumerator enumerator, boolean isBackFacing) { - final String[] deviceNames = enumerator.getDeviceNames(); - // First, try to find front facing camera - Logging.d(TAG, "Looking for front facing cameras."); - for (String deviceName : deviceNames) { - if (enumerator.isFrontFacing(deviceName)) { - Logging.d(TAG, "Creating front facing camera capturer."); - VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null); - - if (videoCapturer != null && !isBackFacing) { - return videoCapturer; - } - } - } - - // Front facing camera not found, try something else - Logging.d(TAG, "Looking for other cameras."); - for (String deviceName : deviceNames) { - if (!enumerator.isFrontFacing(deviceName)) { - Logging.d(TAG, "Creating other camera capturer."); - VideoCapturer videoCapturer = enumerator.createCapturer(deviceName, null); - - if (videoCapturer != null && isBackFacing) { - return videoCapturer; - } - } - } - - return null; - } - /** - * @param context - * @param localSink * @param streamHandle * @param track * @throws IllegalStateException if call addTrack before call createStream */ public void addTrack( - Context context, - VideoSink localSink, StreamHandle streamHandle, - MediaDevice track + MediaStreamTrack track ) throws IllegalStateException { + Objects.requireNonNull(streamHandle); RoomJanusSession session = pcManager.getSession(streamHandle); if (session == null) throw new IllegalStateException("Stream not exists. Create stream first."); - JanusPublisher connection = session.getPublisher(); - if (connection == null) + JanusPublisher publisher = session.getPublisher(); + if (publisher == null) throw new IllegalStateException("This StreamHandle has not created companion publisher."); - switch (track.type) { - case Audio: { - AudioSource audioSource = connection.peerConnectionFactory.createAudioSource(new MediaConstraints()); - AudioTrack audioTrack = connection.peerConnectionFactory.createAudioTrack(track.name, audioSource); - audioTrack.setVolume(10.0); - connection.addAudioTrack(audioTrack); + switch (track.kind()) { + case MediaStreamTrack.VIDEO_TRACK_KIND: { + publisher.addVideoTrack((VideoTrack) track); break; } - - case Video: { - SurfaceTextureHelper surfaceTextureHelper = - SurfaceTextureHelper.create("CaptureThread", rootEglBase.getEglBaseContext()); - VideoSource videoSource = connection.peerConnectionFactory.createVideoSource(false, false); // todo - zaimplementowac caly capturer? - VideoCapturer capturer = createCameraCapturer(new Camera2Enumerator(context)); - capturer.initialize(surfaceTextureHelper, appContext, videoSource.getCapturerObserver()); -// capturer.startCapture(1920, 1080, 30); - VideoTrack videoTrack = connection.peerConnectionFactory.createVideoTrack(track.name, videoSource); - videoTrack.setEnabled(true); - videoTrack.addSink(localSink); - connection.addVideoTrack(videoTrack,capturer); -// if (Camera2Enumerator.isSupported(appContext)) { -// enumerator = new Camera2Enumerator(appContext); -// } else { -// enumerator = new Camera1Enumerator(true); -// } -// capturer = enumerator.createCapturer(track.name, null); - - capturer.startCapture(1280, 720, 30); // ??? - System.out.println("after start capturer"); + case MediaStreamTrack.AUDIO_TRACK_KIND: { + publisher.addAudioTrack((AudioTrack) track); break; } } } - public void addTrackAudio( - AudioTrack audioTrack, - StreamHandle streamHandle, - MediaDevice track + public void setTrackObserver( + String roomId, + TrackObserver observer, + String streamId ) { - RoomJanusSession session = pcManager.getSession(streamHandle); - JanusPublisher connection = session.getPublisher(); + Objects.requireNonNull(roomId); + RoomJanusSession session = pcManager.getSession(roomId); if (session == null) - throw new IllegalStateException("Stream not exists. Create stream first."); - if (connection == null) - throw new IllegalStateException("This StreamHandle has not created companion publisher."); - - if (track.type == DeviceType.Audio) { - audioTrack.setEnabled(true); - connection.addAudioTrack(audioTrack); - } + throw new IllegalStateException("Session to this room is not exists. Call joinStreamRoom first."); + session.setTrackObserver(streamId, observer); } - public void addTrackVideo( - Context context, - VideoSink localSink, - StreamHandle streamHandle, - MediaDevice track, - Boolean isScreenCast, - VideoCapturer capturer, - boolean isBackFacing + public void setTrackObserver( + String roomId, + TrackObserver observer ) { - RoomJanusSession session = pcManager.getSession(streamHandle); - JanusPublisher connection = session.getPublisher(); - SurfaceTextureHelper surfaceTextureHelper; - - VideoCapturer currentCapturer; - if (isScreenCast) { - surfaceTextureHelper = SurfaceTextureHelper.create("ScreenCaptureThread", rootEglBase.getEglBaseContext()); - currentCapturer = capturer; - } else { - surfaceTextureHelper = SurfaceTextureHelper.create("CaptureThread", rootEglBase.getEglBaseContext()); - currentCapturer = createCameraCapturer(new Camera2Enumerator(context), isBackFacing); - } - - VideoSource videoSource = connection.peerConnectionFactory.createVideoSource(isScreenCast); - currentCapturer.initialize(surfaceTextureHelper, appContext, videoSource.getCapturerObserver()); - - VideoTrack videoTrack = connection.peerConnectionFactory.createVideoTrack(track.name, videoSource); - videoTrack.setEnabled(true); - videoTrack.addSink(localSink); - connection.addVideoTrack( - videoTrack, - currentCapturer - ); - - DisplayMetrics metrics = new DisplayMetrics(); - Objects.requireNonNull(context.getDisplay()).getMetrics(metrics); - - int width = metrics.widthPixels; - int height = metrics.heightPixels; - - currentCapturer.startCapture(width, height, 30); - + setTrackObserver(roomId, observer, null); } /** @@ -430,6 +245,7 @@ public void removeTrack( StreamHandle streamHandle, MediaStreamTrack track ) throws IllegalStateException { + Objects.requireNonNull(streamHandle); RoomJanusSession session = pcManager.getSession(streamHandle); if (session == null) throw new IllegalStateException("Stream with this StreamHandle doesn't exist."); @@ -443,33 +259,18 @@ public void removeTrack( } } - public void removeTrack( - StreamHandle streamHandle, - MediaDevice track - ) throws IllegalStateException { - RoomJanusSession session = pcManager.getSession(streamHandle); - if (session == null) - throw new IllegalStateException("Stream with this StreamHandle doesn't exist."); - JanusPublisher publisher = session.getPublisher(); - - if (publisher == null) - throw new IllegalStateException("This StreamHandle has not created companion publisher."); - if (track.type == DeviceType.Audio) { - publisher.removeAudioTrack(track.name); - } else if (track.type == DeviceType.Video) { - publisher.removeVideoTrack(track.name); - } - } - public StreamPublishResult publishStream(StreamHandle streamHandle) { + Objects.requireNonNull(streamHandle); return api.publishStream(streamHandle); } public StreamPublishResult updateStream(StreamHandle streamHandle) { + Objects.requireNonNull(streamHandle); return api.updateStream(streamHandle); } public void unpublishStream(StreamHandle streamHandle) { + Objects.requireNonNull(streamHandle); api.unpublishStream(streamHandle); } @@ -490,7 +291,7 @@ public void subscribeToRemoteStreams( throw new IllegalStateException("No active session to this Stream Room. Join stream room first"); try { session.createSubscriber(); - }catch (IllegalStateException e){ + } catch (IllegalStateException e) { throw new IllegalStateException("Subscriber is now active, try use modifyRemoteStreamsSubscriptions"); } api.subscribeToRemoteStreams(streamRoomId, subscriptions, options); @@ -538,7 +339,7 @@ public void dropBrokenFrames( boolean enable ) { RoomJanusSession session = pcManager.getSession(streamRoomId); - if(session != null){ + if (session != null) { PmxFrameCryptor.PmxFrameCryptorOptions options = new PmxFrameCryptor.PmxFrameCryptorOptions(); options.dropFrameIfCryptionFailed = enable; session.setFrameCryptorOptions(options); diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackFactory.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackFactory.java new file mode 100644 index 00000000..f051f6ea --- /dev/null +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackFactory.java @@ -0,0 +1,45 @@ +package com.simplito.java.privmx_endpoint.modules.stream; + +import org.webrtc.AudioSource; +import org.webrtc.AudioTrack; +import org.webrtc.MediaConstraints; +import org.webrtc.PeerConnectionFactory; +import org.webrtc.VideoSource; +import org.webrtc.VideoTrack; + +public class TrackFactory { + private final PeerConnectionFactory factory; + TrackFactory(PeerConnectionManager pcManager){ + factory = pcManager.pcFactory; + } + + //TODO: Maybe creating sources should be hidden + public VideoSource createVideoSource(boolean isScreenCast){ + return factory.createVideoSource(isScreenCast); + } + + //TODO: Maybe creating sources should be hidden + public VideoSource createVideoSource(boolean isScreenCast, boolean alignTimestamps){ + return factory.createVideoSource(isScreenCast,alignTimestamps); + } + + //TODO: Maybe creating sources should be hidden + public AudioSource createAudioSource(){ + return factory.createAudioSource(new MediaConstraints()); + } + + public VideoTrack createVideoTrack( + String id, + VideoSource videoSource + ){ + return factory.createVideoTrack(id,videoSource); + } + + public AudioTrack createAudioTrack( + String id, + AudioSource audioSource + ){ + return factory.createAudioTrack(id,audioSource); + } + +} \ No newline at end of file diff --git a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackObserver.java b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackObserver.java index 5ab019ee..8de6eba2 100644 --- a/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackObserver.java +++ b/privmx-endpoint-streams/android/src/main/java/com/simplito/java/privmx_endpoint/modules/stream/TrackObserver.java @@ -3,7 +3,5 @@ import org.webrtc.MediaStreamTrack; public interface TrackObserver { - void onTrack(MediaStreamTrack track); - void onVideoTrack(String trackId); - void onRemoveVideoTrack(String trackId); + void OnRemoteTrack(String streamId, MediaStreamTrack track); }