Search in sources :

Example 6 with BroadcastVideoSink

use of org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink in project Signal-Android by signalapp.

the class WebRtcVideoUtil method initializeVideo.

@NonNull
public static WebRtcServiceState initializeVideo(@NonNull Context context, @NonNull CameraEventListener cameraEventListener, @NonNull WebRtcServiceState currentState, @NonNull Object eglBaseHolder) {
    final WebRtcServiceStateBuilder builder = currentState.builder();
    ThreadUtil.runOnMainSync(() -> {
        EglBaseWrapper eglBase = EglBaseWrapper.acquireEglBase(eglBaseHolder);
        BroadcastVideoSink localSink = new BroadcastVideoSink(eglBase, true, false, currentState.getLocalDeviceState().getOrientation().getDegrees());
        Camera camera = new Camera(context, cameraEventListener, eglBase, CameraState.Direction.FRONT);
        camera.setOrientation(currentState.getLocalDeviceState().getOrientation().getDegrees());
        builder.changeVideoState().eglBase(eglBase).localSink(localSink).camera(camera).commit().changeLocalDeviceState().cameraState(camera.getCameraState()).commit();
    });
    return builder.build();
}
Also used : BroadcastVideoSink(org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink) WebRtcServiceStateBuilder(org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceStateBuilder) EglBaseWrapper(org.thoughtcrime.securesms.components.webrtc.EglBaseWrapper) Camera(org.thoughtcrime.securesms.ringrtc.Camera) NonNull(androidx.annotation.NonNull)

Example 7 with BroadcastVideoSink

use of org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink in project Signal-Android by WhisperSystems.

the class WebRtcVideoUtil method initializeVideo.

@NonNull
public static WebRtcServiceState initializeVideo(@NonNull Context context, @NonNull CameraEventListener cameraEventListener, @NonNull WebRtcServiceState currentState, @NonNull Object eglBaseHolder) {
    final WebRtcServiceStateBuilder builder = currentState.builder();
    ThreadUtil.runOnMainSync(() -> {
        EglBaseWrapper eglBase = EglBaseWrapper.acquireEglBase(eglBaseHolder);
        BroadcastVideoSink localSink = new BroadcastVideoSink(eglBase, true, false, currentState.getLocalDeviceState().getOrientation().getDegrees());
        Camera camera = new Camera(context, cameraEventListener, eglBase, CameraState.Direction.FRONT);
        camera.setOrientation(currentState.getLocalDeviceState().getOrientation().getDegrees());
        builder.changeVideoState().eglBase(eglBase).localSink(localSink).camera(camera).commit().changeLocalDeviceState().cameraState(camera.getCameraState()).commit();
    });
    return builder.build();
}
Also used : BroadcastVideoSink(org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink) WebRtcServiceStateBuilder(org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceStateBuilder) EglBaseWrapper(org.thoughtcrime.securesms.components.webrtc.EglBaseWrapper) Camera(org.thoughtcrime.securesms.ringrtc.Camera) NonNull(androidx.annotation.NonNull)

Example 8 with BroadcastVideoSink

use of org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink in project Signal-Android by WhisperSystems.

the class GroupActionProcessor method handleUpdateRenderedResolutions.

@Override
@NonNull
protected WebRtcServiceState handleUpdateRenderedResolutions(@NonNull WebRtcServiceState currentState) {
    Map<CallParticipantId, CallParticipant> participants = currentState.getCallInfoState().getRemoteCallParticipantsMap();
    ArrayList<GroupCall.VideoRequest> resolutionRequests = new ArrayList<>(participants.size());
    for (Map.Entry<CallParticipantId, CallParticipant> entry : participants.entrySet()) {
        BroadcastVideoSink videoSink = entry.getValue().getVideoSink();
        BroadcastVideoSink.RequestedSize maxSize = videoSink.getMaxRequestingSize();
        resolutionRequests.add(new GroupCall.VideoRequest(entry.getKey().getDemuxId(), maxSize.getWidth(), maxSize.getHeight(), null));
        videoSink.setCurrentlyRequestedMaxSize(maxSize);
    }
    try {
        currentState.getCallInfoState().requireGroupCall().requestVideo(resolutionRequests);
    } catch (CallException e) {
        return groupCallFailure(currentState, "Unable to set rendered resolutions", e);
    }
    return currentState;
}
Also used : CallException(org.signal.ringrtc.CallException) CallParticipant(org.thoughtcrime.securesms.events.CallParticipant) BroadcastVideoSink(org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink) ArrayList(java.util.ArrayList) CallParticipantId(org.thoughtcrime.securesms.events.CallParticipantId) GroupCall(org.signal.ringrtc.GroupCall) Map(java.util.Map) NonNull(androidx.annotation.NonNull)

Example 9 with BroadcastVideoSink

use of org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink in project Signal-Android by WhisperSystems.

the class GroupActionProcessor method handleGroupRemoteDeviceStateChanged.

@Override
@NonNull
protected WebRtcServiceState handleGroupRemoteDeviceStateChanged(@NonNull WebRtcServiceState currentState) {
    Log.i(tag, "handleGroupRemoteDeviceStateChanged():");
    GroupCall groupCall = currentState.getCallInfoState().requireGroupCall();
    Map<CallParticipantId, CallParticipant> participants = currentState.getCallInfoState().getRemoteCallParticipantsMap();
    LongSparseArray<GroupCall.RemoteDeviceState> remoteDevices = groupCall.getRemoteDeviceStates();
    if (remoteDevices == null) {
        Log.w(tag, "Unable to update remote devices with null list.");
        return currentState;
    }
    WebRtcServiceStateBuilder.CallInfoStateBuilder builder = currentState.builder().changeCallInfoState().clearParticipantMap();
    List<GroupCall.RemoteDeviceState> remoteDeviceStates = new ArrayList<>(remoteDevices.size());
    for (int i = 0; i < remoteDevices.size(); i++) {
        remoteDeviceStates.add(remoteDevices.get(remoteDevices.keyAt(i)));
    }
    Collections.sort(remoteDeviceStates, (a, b) -> Long.compare(a.getAddedTime(), b.getAddedTime()));
    Set<Recipient> seen = new HashSet<>();
    seen.add(Recipient.self());
    for (GroupCall.RemoteDeviceState device : remoteDeviceStates) {
        Recipient recipient = Recipient.externalPush(ACI.from(device.getUserId()), null, false);
        CallParticipantId callParticipantId = new CallParticipantId(device.getDemuxId(), recipient.getId());
        CallParticipant callParticipant = participants.get(callParticipantId);
        BroadcastVideoSink videoSink;
        VideoTrack videoTrack = device.getVideoTrack();
        if (videoTrack != null) {
            videoSink = (callParticipant != null && callParticipant.getVideoSink().getLockableEglBase().getEglBase() != null) ? callParticipant.getVideoSink() : new BroadcastVideoSink(currentState.getVideoState().getLockableEglBase(), true, true, currentState.getLocalDeviceState().getOrientation().getDegrees());
            videoTrack.addSink(videoSink);
        } else {
            videoSink = new BroadcastVideoSink();
        }
        builder.putParticipant(callParticipantId, CallParticipant.createRemote(callParticipantId, recipient, null, videoSink, Boolean.FALSE.equals(device.getAudioMuted()), Boolean.FALSE.equals(device.getVideoMuted()), device.getSpeakerTime(), device.getMediaKeysReceived(), device.getAddedTime(), Boolean.TRUE.equals(device.getPresenting()), seen.contains(recipient) ? CallParticipant.DeviceOrdinal.SECONDARY : CallParticipant.DeviceOrdinal.PRIMARY));
        seen.add(recipient);
    }
    builder.remoteDevicesCount(remoteDevices.size());
    return builder.build();
}
Also used : CallParticipant(org.thoughtcrime.securesms.events.CallParticipant) BroadcastVideoSink(org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink) ArrayList(java.util.ArrayList) CallParticipantId(org.thoughtcrime.securesms.events.CallParticipantId) Recipient(org.thoughtcrime.securesms.recipients.Recipient) WebRtcServiceStateBuilder(org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceStateBuilder) VideoTrack(org.webrtc.VideoTrack) GroupCall(org.signal.ringrtc.GroupCall) HashSet(java.util.HashSet) NonNull(androidx.annotation.NonNull)

Example 10 with BroadcastVideoSink

use of org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink in project Signal-Android by WhisperSystems.

the class WebRtcActionProcessor method handleOrientationChanged.

@NonNull
protected WebRtcServiceState handleOrientationChanged(@NonNull WebRtcServiceState currentState, boolean isLandscapeEnabled, int orientationDegrees) {
    Camera camera = currentState.getVideoState().getCamera();
    if (camera != null) {
        camera.setOrientation(orientationDegrees);
    }
    int sinkRotationDegrees = isLandscapeEnabled ? BroadcastVideoSink.DEVICE_ROTATION_IGNORE : orientationDegrees;
    int stateRotationDegrees = isLandscapeEnabled ? 0 : orientationDegrees;
    BroadcastVideoSink sink = currentState.getVideoState().getLocalSink();
    if (sink != null) {
        sink.setDeviceOrientationDegrees(sinkRotationDegrees);
    }
    for (CallParticipant callParticipant : currentState.getCallInfoState().getRemoteCallParticipants()) {
        callParticipant.getVideoSink().setDeviceOrientationDegrees(sinkRotationDegrees);
    }
    return currentState.builder().changeLocalDeviceState().setOrientation(Orientation.fromDegrees(stateRotationDegrees)).setLandscapeEnabled(isLandscapeEnabled).setDeviceOrientation(Orientation.fromDegrees(orientationDegrees)).build();
}
Also used : CallParticipant(org.thoughtcrime.securesms.events.CallParticipant) BroadcastVideoSink(org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink) Camera(org.thoughtcrime.securesms.ringrtc.Camera) NonNull(androidx.annotation.NonNull)

Aggregations

NonNull (androidx.annotation.NonNull)16 BroadcastVideoSink (org.thoughtcrime.securesms.components.webrtc.BroadcastVideoSink)16 CallParticipantId (org.thoughtcrime.securesms.events.CallParticipantId)10 CallParticipant (org.thoughtcrime.securesms.events.CallParticipant)8 CallException (org.signal.ringrtc.CallException)6 GroupCall (org.signal.ringrtc.GroupCall)6 Recipient (org.thoughtcrime.securesms.recipients.Recipient)6 WebRtcServiceStateBuilder (org.thoughtcrime.securesms.service.webrtc.state.WebRtcServiceStateBuilder)6 ArrayList (java.util.ArrayList)4 EglBaseWrapper (org.thoughtcrime.securesms.components.webrtc.EglBaseWrapper)4 Camera (org.thoughtcrime.securesms.ringrtc.Camera)4 RemotePeer (org.thoughtcrime.securesms.ringrtc.RemotePeer)4 Uri (android.net.Uri)2 Stream (com.annimon.stream.Stream)2 HashSet (java.util.HashSet)2 List (java.util.List)2 Map (java.util.Map)2 Log (org.signal.core.util.logging.Log)2 PeekInfo (org.signal.ringrtc.PeekInfo)2 RecipientDatabase (org.thoughtcrime.securesms.database.RecipientDatabase)2