/* * Copyright 2007 Sun Microsystems, Inc. * * This file is part of jVoiceBridge. * * jVoiceBridge is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation and distributed hereunder * to you. * * jVoiceBridge is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * Sun designates this particular file as subject to the "Classpath" * exception as provided by Sun in the License file that accompanied this * code. */ package com.sun.voip; import java.io.IOException; import java.net.InetSocketAddress; import java.util.Vector; public class SdpInfo { private String sdp; private String remoteHost; private int remotePort; private byte telephoneEventPayload; private boolean preferredMediaSpecified; private String userName; private String callId; private String conferenceId; private boolean isDistributedBridge; private int synchronizationSource; private InetSocketAddress rtcpAddress; private Vector supportedMedia; private MediaInfo mediaInfo; private MediaInfo transmitMediaInfo; private boolean transmitMediaInfoOk; public SdpInfo(String remoteHost, int remotePort, byte telephoneEventPayload, Vector supportedMedia, MediaInfo mediaInfo, boolean preferredMediaSpecified) { this.remoteHost = remoteHost; this.remotePort = remotePort; this.telephoneEventPayload = telephoneEventPayload; this.supportedMedia = supportedMedia; this.mediaInfo = mediaInfo; this.preferredMediaSpecified = preferredMediaSpecified; } public void setSdp(String sdp) { this.sdp = sdp; } public String getSdp() { return sdp; } public void setRemoteHost(String remoteHost) { this.remoteHost = remoteHost; } public String getRemoteHost() { return remoteHost; } public void setRemotePort(int remotePort) { this.remotePort = remotePort; } public int getRemotePort() { return remotePort; } public byte getTelephoneEventPayload() { return telephoneEventPayload; } public void setUserName(String userName) { this.userName= userName; } public String getUserName() { return userName; } public void setCallId(String callId) { this.callId = callId; } public String getCallId() { return callId; } public void setConferenceId(String conferenceId) { this.conferenceId = conferenceId; } public String getConferenceId() { return conferenceId; } public void setDistributedBridge() { isDistributedBridge = true; } public boolean isDistributedBridge() { return isDistributedBridge; } public void setRtcpAddress(InetSocketAddress rtcpAddress) { this.rtcpAddress = rtcpAddress; } public InetSocketAddress getRtcpAddress() { return rtcpAddress; } public void setMediaInfo(MediaInfo mediaInfo) { this.mediaInfo = mediaInfo; } public MediaInfo getMediaInfo() { return mediaInfo; } public void setTransmitMediaInfoOk(boolean transmitMediaInfoOk) { this.transmitMediaInfoOk = transmitMediaInfoOk; } public boolean getTransmitMediaInfoOk() { return transmitMediaInfoOk; } public void setTransmitMediaInfo(MediaInfo transmitMediaInfo) { this.transmitMediaInfo = transmitMediaInfo; } public MediaInfo getTransmitMediaInfo() { if (transmitMediaInfo == null || mediaInfo.getPayload() == RtpPacket.PCMU_PAYLOAD) { return mediaInfo; } int transmitSampleRate = transmitMediaInfo.getSampleRate(); if (transmitSampleRate > mediaInfo.getSampleRate()) { transmitSampleRate = mediaInfo.getSampleRate(); } int transmitChannels = transmitMediaInfo.getChannels(); if (transmitChannels > mediaInfo.getChannels()) { transmitChannels = mediaInfo.getChannels(); } try { transmitMediaInfo = MediaInfo.findMediaInfo( transmitMediaInfo.getEncoding(), transmitSampleRate, transmitChannels); } catch (IOException e) { Logger.println(e.getMessage()); Logger.println("Using transmit media info " + transmitMediaInfo); } return transmitMediaInfo; } public boolean preferredMediaSpecified() { return preferredMediaSpecified; } public void setSynchronizationSource(int synchronizationSource) { Logger.println("Setting sync to " + synchronizationSource); this.synchronizationSource = synchronizationSource; } public int getSynchronizationSource() { return synchronizationSource; } public boolean isSupported(MediaInfo mediaInfo) { try { getMediaInfo(mediaInfo.getSampleRate(), mediaInfo.getChannels(), mediaInfo.getEncoding()); } catch (IOException e) { return false; } return true; } public MediaInfo getMediaInfo(int sampleRate, int channels, int encoding) throws IOException { if (supportedMedia != null) { for (int i = 0; i < supportedMedia.size(); i++) { MediaInfo mediaInfo = (MediaInfo) supportedMedia.elementAt(i); if (mediaInfo.getSampleRate() == sampleRate && mediaInfo.getChannels() == channels && mediaInfo.getEncoding() == encoding) { return mediaInfo; } } } throw new IOException("No Suitable media for " + encoding + "/" + sampleRate + "/" + channels); } public MediaInfo findBestMediaInfo(Vector otherSupportedMedia, MediaInfo otherMediaPreference) throws IOException { MediaInfo best = null; for (int i = 0; i < otherSupportedMedia.size(); i++) { MediaInfo m = (MediaInfo) otherSupportedMedia.elementAt(i); if (!isSupported(m)) { continue; } if (otherMediaPreference != null) { if (m.getSampleRate() > otherMediaPreference.getSampleRate() || m.getChannels() > otherMediaPreference.getChannels()) { continue; } } if (best == null || isBetter(m, best)) { best = m; } } if (best == null) { throw new IOException("No supported Media!"); } return best; } private boolean isBetter(MediaInfo m1, MediaInfo m2) { if (m1.getSampleRate() > m2.getSampleRate() && m1.getChannels() >= m2.getChannels()) { return true; } if (m1.getSampleRate() == m2.getSampleRate() && m1.getChannels() > m2.getChannels()) { return true; } return false; } }