public boolean setup(SessionDescription sd, int mediaIndex) { boolean finish = false; try { Vector<MediaDescription> mds = sd.getMediaDescriptions(true); if (mds.size() <= mediaIndex) { finish = true; } else { MediaDescription md = mds.get(mediaIndex); RtpSessionExt rtp = rtspStack.createRtpSession(md); rtp.bind(false, true); // sendTCPSetup(md.getAttribute("control"), rtp.getRtpInterleaved(), // rtp.getRtcpInterleaved()); sendUDPSetup(md.getAttribute("control"), rtp.getRtpPort(), rtp.getRtcpPort()); setState(RTSP.SETUP); } } catch (SdpException e) { throw new IllegalArgumentException(e); } catch (IllegalStateException e) { logger.error(e.getMessage(), e); } catch (IOException e) { logger.error(e.getMessage(), e); } return finish; }
// Issue 308: https://telestax.atlassian.net/browse/RESTCOMM-308 @SuppressWarnings("unchecked") private static String patch(final byte[] data, final String externalIp) throws UnknownHostException, SdpException { final String text = new String(data); final SessionDescription sdp = SdpFactory.getInstance().createSessionDescription(text); SessionName sessionName = SdpFactory.getInstance().createSessionName("Restcomm B2BUA"); sdp.setSessionName(sessionName); // Handle the connection at the session level. fix(sdp.getConnection(), externalIp); // Handle the connections at the media description level. final Vector<MediaDescription> descriptions = sdp.getMediaDescriptions(false); for (final MediaDescription description : descriptions) { fix(description.getConnection(), externalIp); } sdp.getOrigin().setAddress(externalIp); return sdp.toString(); }
/** * Fired when call state changes * * @param evt CallStateEvent */ public void callStateChanged(CallStateEvent evt) { try { for (SoftPhoneListener sfl : softPhoneListeners) { sfl.callStateChanged(evt); } Call call = evt.getSourceCall(); Log.debug("callStateChanged", evt.getOldState() + " -> " + evt.getNewState()); if (evt.getNewState() == Call.CONNECTED) { // sipManager.setBusy(true); if (call.getAudioReceiverChannel() != null) call.getAudioReceiverChannel().stop(); if (evt.getOldState() == Call.MOVING_REMOTELY) { AudioMediaSession audioMediaSession = evt.getSourceCall().getAudioMediaSession(); if (call.getAudioReceiverChannel() != null) call.getAudioReceiverChannel().stop(); if (audioMediaSession != null) { audioMediaSession.stopTrasmit(); audioMediaSession.stopReceive(); } VideoMediaSession videoMediaSession = evt.getSourceCall().getVideoMediaSession(); if (videoMediaSession != null) { videoMediaSession.stopTrasmit(); videoMediaSession.stopReceive(); } PhoneManager.setUsingMediaLocator(false); } int localAudioPort = -1; int localVideoPort = -1; Vector<MediaDescription> mediaDescriptions = call.getLocalSdpDescription().getMediaDescriptions(true); for (MediaDescription mediaDescription : mediaDescriptions) { if (mediaDescription.getMedia().getMediaType().equals("audio")) localAudioPort = mediaDescription.getMedia().getMediaPort(); else if (mediaDescription.getMedia().getMediaType().equals("video")) localVideoPort = mediaDescription.getMedia().getMediaPort(); } AudioMediaSession audioMediaSession = mediaManager.createAudioMediaSession( call.getRemoteSdpDescription().toString(), localAudioPort); call.setAudioMediaSession(audioMediaSession); if (audioMediaSession != null) { audioMediaSession.startTrasmit(); audioMediaSession.startReceive(); } // If remote client have video if (localVideoPort > 0) { if (SettingsManager.getLocalPreferences().getVideoDevice() != null && !"".equals(SettingsManager.getLocalPreferences().getVideoDevice())) { VideoMediaSession videoMediaSession = mediaManager.createVideoMediaSession( call.getRemoteSdpDescription().toString(), localVideoPort); if (videoMediaSession != null) { videoMediaSession.startTrasmit(); videoMediaSession.startReceive(); call.setVideoMediaSession(videoMediaSession); } } } evt.getSourceCall().start(); Log.debug("MEDIA STREAMS OPENED"); } else if (evt.getNewState() == Call.RINGING) { if (call.getRemoteSdpDescription() != null && !call.getRemoteSdpDescription().equals("")) { Log.debug("STATE", call.getRemoteSdpDescription().toString()); int localPort = ((MediaDescription) (call.getLocalSdpDescription().getMediaDescriptions(true).get(0))) .getMedia() .getMediaPort(); int destPort = ((MediaDescription) (call.getRemoteSdpDescription().getMediaDescriptions(true).get(0))) .getMedia() .getMediaPort(); String destIp = call.getRemoteSdpDescription().getConnection().getAddress(); AudioReceiverChannel audioReceiverChannel = mediaManager.createAudioReceiverChannel(localPort, destIp, destPort, (destPort + 1)); call.setAudioReceiverChannel(audioReceiverChannel); if (audioReceiverChannel != null) audioReceiverChannel.start(); } } else if (evt.getNewState() == Call.DISCONNECTED) { sipManager.setBusy(false); AudioMediaSession audioMediaSession = evt.getSourceCall().getAudioMediaSession(); if (audioMediaSession != null) { audioMediaSession.stopTrasmit(); audioMediaSession.stopReceive(); } if (call.getAudioReceiverChannel() != null) call.getAudioReceiverChannel().stop(); VideoMediaSession videoMediaSession = evt.getSourceCall().getVideoMediaSession(); if (videoMediaSession != null) { videoMediaSession.stopTrasmit(); videoMediaSession.stopReceive(); } PhoneManager.setUsingMediaLocator(false); } else if (evt.getNewState() == Call.FAILED) { call.setState(Call.DISCONNECTED); if (call.getAudioReceiverChannel() != null) call.getAudioReceiverChannel().stop(); CallRejectedEvent rejectEvt = new CallRejectedEvent("Disconnected", call.getLastRequest(), call); for (SoftPhoneListener softPhoneListener : softPhoneListeners) { softPhoneListener.callRejectedRemotely(rejectEvt); } PhoneManager.setUsingMediaLocator(false); } } catch (Exception e) { Log.error("callStateChanged", e); } }