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
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,10 @@
import java.util.function.Consumer;

public class JanusPublisher extends JanusConnection{
public final Map<String, AudioTrackInfo> audioTracks = new HashMap<>();
public final Map<String, VideoTrackInfo> videoTracks = new HashMap<>();
//TODO: Add videoCapturer to VideoTrackInfo
public final Map<String, VideoCapturer> videoCapturers = new HashMap<>();
public final BiConsumer<Long, SdpWithTypeModel> setNewOfferOnReconfigure;
public final ExecutorService executorService = Executors.newSingleThreadExecutor();
private final Map<String, AudioTrackInfo> audioTracks = new HashMap<>();
private final Map<String, VideoTrackInfo> videoTracks = new HashMap<>();
private final BiConsumer<Long, SdpWithTypeModel> setNewOfferOnReconfigure;
private final ExecutorService executorService = Executors.newSingleThreadExecutor();


public JanusPublisher(
Expand Down Expand Up @@ -67,10 +65,7 @@ public void addAudioTrack(org.webrtc.AudioTrack audioTrack) {
}
}

public void addVideoTrack(
org.webrtc.VideoTrack videoTrack,
VideoCapturer videoCapturer
) {
public void addVideoTrack(org.webrtc.VideoTrack videoTrack) {
if (peerConnectionFactory != null) {
synchronized (videoTracks) {
RtpSender rtpSender = peerConnection.addTrack(videoTrack);
Expand All @@ -89,17 +84,10 @@ public void addVideoTrack(
frameCryptor
)
);
if (videoCapturer != null) {
videoCapturers.put(videoTrack.id(), videoCapturer);
}
}
}
}

public void addVideoTrack(org.webrtc.VideoTrack videoTrack) {
addVideoTrack(videoTrack,null);
}

public void removeAudioTrack(String id) {
synchronized (audioTracks) {
AudioTrackInfo audioTrackInfo = audioTracks.get(id);
Expand All @@ -115,7 +103,6 @@ public void removeVideoTrack(String id) {
if (videoTrackInfo == null) return;
peerConnection.removeTrack(videoTrackInfo.sender);
videoTracks.remove(id);
videoCapturers.remove(id);
}
}

Expand All @@ -135,17 +122,12 @@ public void setAnswer(String sdp, String type){
peerConnection.setRemoteDescription(new SdpObserver(null),new SessionDescription(SessionDescription.Type.fromCanonicalForm(type),sdp));
}

@Nullable
public VideoCapturer getVideoCapturer(String trackId){
return videoCapturers.get(trackId);
}

@Override
public void close() {
super.close();
audioTracks.clear();
videoTracks.clear();
videoCapturers.clear();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

public class JanusSubscriber extends JanusConnection{
public JanusSubscriber(PeerConnectionFactory pcFactory, PmxKeyStore keyStore, TrackObserver observer, BiConsumer<Long,String> onTrickle) {
super(pcFactory, keyStore, ConnectionType.Publisher, observer, onTrickle,null);
super(pcFactory, keyStore, ConnectionType.Subscriber, observer, onTrickle,null);
}

public String createAnswer(String offerSdp, String type) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,20 +22,14 @@
import java.util.function.Consumer;
import java.util.stream.Collectors;

//TODO: Fix warnings
public class PcObserver implements PeerConnection.Observer {
Map<String, PmxFrameCryptor> frameCryptorMap = new HashMap<>();
PmxKeyStore keyStore;
private PeerConnectionFactory peerConnectionFactory;
public TrackObserver trackObserver;

private BiConsumer<List<MediaStream>, RtpReceiver> onAddTrack;
private Consumer<String> onVideoTrack;

private Consumer<IceCandidate> onIceCandidate;
private final Map<String,String> streamIdsByTracks = new HashMap<>();
private final Map<String, PmxFrameCryptor> frameCryptorMap = new HashMap<>();
private final PmxKeyStore keyStore;
private final PeerConnectionFactory peerConnectionFactory;
private final TrackObserver trackObserver;
private final Consumer<IceCandidate> onIceCandidate;
private final Runnable onRenegotiationNeeded;
Consumer<PeerConnection.IceConnectionState> onIceConnectionChange;
private final Consumer<PeerConnection.IceConnectionState> onIceConnectionChange;

public PcObserver(
PeerConnectionFactory peerConnectionFactory,
Expand Down Expand Up @@ -63,14 +57,6 @@ public PcObserver(
this(peerConnectionFactory,store,observer,onIceCandidate,onRenegotiationNeeded,null);
}

public void setOnAddTrack(BiConsumer<List<MediaStream>, RtpReceiver> onAddTrack) {
this.onAddTrack = onAddTrack;
}

public void setOnVideoTrack(Consumer<String> onVideoTrack) {
this.onVideoTrack = onVideoTrack;
}

@Override
public void onSignalingChange(PeerConnection.SignalingState signalingState) {

Expand Down Expand Up @@ -146,9 +132,13 @@ public void onAddTrack(RtpReceiver receiver, MediaStream[] mediaStreams) {

@Override
public void onRemoveTrack(RtpReceiver receiver) {
//TODO: cleanup track cryptors (?)
// onRemoveTrack.accept(receiver.track());
receiver.dispose();
MediaStreamTrack track = receiver.track();
if(track != null) {
PmxFrameCryptor removedCryptor = frameCryptorMap.remove(track.id());
if(removedCryptor != null) {
removedCryptor.dispose();
}
}
}

public void setFrameCryptorOptions(PmxFrameCryptor.PmxFrameCryptorOptions options) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import android.content.Context;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.simplito.java.privmx_endpoint.model.ContainerPolicy;
import com.simplito.java.privmx_endpoint.model.PagingList;
Expand Down Expand Up @@ -32,21 +31,11 @@
import org.webrtc.audio.AudioDeviceModule;
import org.webrtc.audio.JavaAudioDeviceModule;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.function.Consumer;
import java.util.stream.Collectors;

//TODO: Good to remove context from StreamApi
public class StreamApi {
public static final String VIDEO_TRACK_ID = "ARDAMSv0";
public static final String AUDIO_TRACK_ID = "ARDAMSa0";
public static final String VIDEO_TRACK_TYPE = "video";
private static final String TAG = "StreamApi";

private final Context appContext;
private final EglBase rootEglBase;
private final StreamApiLow api;
private final PeerConnectionManager pcManager;
public final TrackFactory trackFactory;
Expand Down Expand Up @@ -83,29 +72,13 @@ private static PeerConnectionFactory DefaultPeerConnectionFactory(
return factory;
}

public StreamApi(
Context appContext,
EglBase rootEglBase,
StreamApiLow api
) {
this(appContext, rootEglBase, api, null);
}

public StreamApi(
@NonNull Context appContext,
@NonNull EglBase rootEglBase,
@NonNull StreamApiLow api,
//TODO: remove this parameter
@Nullable PeerConnectionFactory pcFactory
@NonNull StreamApiLow api
) {
this.appContext = appContext;
this.rootEglBase = rootEglBase;
this.api = api;
PeerConnectionFactory factory = pcFactory;
if (factory == null) {
//TODO: What should be passed to the options parameter
factory = DefaultPeerConnectionFactory(appContext, rootEglBase, new PeerConnectionFactory.Options());
}
PeerConnectionFactory factory = DefaultPeerConnectionFactory(appContext, rootEglBase, new PeerConnectionFactory.Options());
pcManager = new PeerConnectionManager(
factory,
(sessionId, rtcConfiguration) -> {
Expand Down Expand Up @@ -172,7 +145,6 @@ public List<StreamInfo> listStreams(String streamRoomId) {
public void joinStreamRoom(
String streamRoomId
) {
//TODO: Rollback this change, it is do only for run test
RoomJanusSession session = pcManager.createSession(streamRoomId);
api.joinStreamRoom(streamRoomId, session.webrtc);
}
Expand Down Expand Up @@ -203,7 +175,7 @@ public StreamHandle createStream(String streamRoomId) {
* @throws IllegalStateException if call addTrack before call createStream
*/
public void addTrack(
StreamHandle streamHandle,
@NonNull StreamHandle streamHandle,
MediaStreamTrack track
) throws IllegalStateException {
Objects.requireNonNull(streamHandle);
Expand All @@ -226,7 +198,7 @@ public void addTrack(
}

public void setTrackObserver(
String roomId,
@NonNull String roomId,
TrackObserver observer,
String streamId
) {
Expand All @@ -238,7 +210,7 @@ public void setTrackObserver(
}

public void setConnectionStateObserver(
String roomId,
@NonNull String roomId,
Consumer<PeerConnection.IceConnectionState> observer
) {
Objects.requireNonNull(roomId);
Expand All @@ -261,8 +233,8 @@ public void setTrackObserver(
* @throws IllegalStateException when Stream with this StreamHandle doesn't exist.
*/
public void removeTrack(
StreamHandle streamHandle,
MediaStreamTrack track
@NonNull StreamHandle streamHandle,
@NonNull MediaStreamTrack track
) throws IllegalStateException {
Objects.requireNonNull(streamHandle);
RoomJanusSession session = pcManager.getSession(streamHandle);
Expand All @@ -278,17 +250,17 @@ public void removeTrack(
}
}

public StreamPublishResult publishStream(StreamHandle streamHandle) {
public StreamPublishResult publishStream(@NonNull StreamHandle streamHandle) {
Objects.requireNonNull(streamHandle);
return api.publishStream(streamHandle);
}

public StreamPublishResult updateStream(StreamHandle streamHandle) {
public StreamPublishResult updateStream(@NonNull StreamHandle streamHandle) {
Objects.requireNonNull(streamHandle);
return api.updateStream(streamHandle);
}

public void unpublishStream(StreamHandle streamHandle) {
public void unpublishStream(@NonNull StreamHandle streamHandle) {
Objects.requireNonNull(streamHandle);
api.unpublishStream(streamHandle);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,29 +1,21 @@
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;
import org.webrtc.*;

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());
}
Expand Down