/*
* 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.util.ArrayList;
public class MediaInfo {
private byte payload;
private int encoding;
private int sampleRate;
private int channels;
private boolean isTelephoneEventPayload;
private int samplesPerPacket;
private static ArrayList supportedMedia = new ArrayList();
static {
supportedMedia.add(new MediaInfo(
(byte)0, RtpPacket.PCMU_ENCODING, 8000, 1, true));
//supportedMedia.add(new MediaInfo(
// (byte)101, RtpPacket.PCM_ENCODING, 8000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)102, RtpPacket.PCM_ENCODING, 8000, 2, false));
supportedMedia.add(new MediaInfo(
(byte)103, RtpPacket.PCM_ENCODING, 16000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)104, RtpPacket.PCM_ENCODING, 16000, 2, false));
supportedMedia.add(new MediaInfo(
(byte)105, RtpPacket.PCM_ENCODING, 32000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)106, RtpPacket.PCM_ENCODING, 32000, 2, false));
supportedMedia.add(new MediaInfo(
(byte)107, RtpPacket.PCM_ENCODING, 44100, 1, false));
supportedMedia.add(new MediaInfo(
(byte)108, RtpPacket.PCM_ENCODING, 44100, 2, false));
if (false) {
supportedMedia.add(new MediaInfo(
(byte)109, RtpPacket.PCM_ENCODING, 48000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)110, RtpPacket.PCM_ENCODING, 48000, 2, false));
}
supportedMedia.add(new MediaInfo(
(byte)111, RtpPacket.PCM_ENCODING, 48000, 2, false));
supportedMedia.add(new MediaInfo(
(byte)112, RtpPacket.PCMU_ENCODING, 16000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)113, RtpPacket.PCMU_ENCODING, 16000, 2, false));
supportedMedia.add(new MediaInfo(
(byte)114, RtpPacket.PCMU_ENCODING, 32000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)115, RtpPacket.PCMU_ENCODING, 32000, 2, false));
if (false) {
supportedMedia.add(new MediaInfo(
(byte)116, RtpPacket.PCMU_ENCODING, 44100, 1, false));
supportedMedia.add(new MediaInfo(
(byte)117, RtpPacket.PCMU_ENCODING, 44100, 2, false));
supportedMedia.add(new MediaInfo(
(byte)118, RtpPacket.PCMU_ENCODING, 48000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)119, RtpPacket.PCMU_ENCODING, 48000, 2, false));
}
supportedMedia.add(new MediaInfo(
(byte)120, RtpPacket.SPEEX_ENCODING, 8000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)121, RtpPacket.SPEEX_ENCODING, 8000, 2, false));
supportedMedia.add(new MediaInfo(
(byte)122, RtpPacket.SPEEX_ENCODING, 16000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)123, RtpPacket.SPEEX_ENCODING, 16000, 2, false));
supportedMedia.add(new MediaInfo(
(byte)124, RtpPacket.SPEEX_ENCODING, 32000, 1, false));
supportedMedia.add(new MediaInfo(
(byte)125, RtpPacket.SPEEX_ENCODING, 32000, 2, false));
}
public MediaInfo(byte payload , int encoding, int sampleRate, int channels, boolean isTelephoneEventPayload)
{
this.payload = payload;
this.encoding = encoding;
this.sampleRate = sampleRate;
this.channels = channels;
this.isTelephoneEventPayload = isTelephoneEventPayload;
samplesPerPacket = sampleRate * channels / (1000 / RtpPacket.PACKET_PERIOD);
}
public static MediaInfo findMediaInfo(int encoding, int sampleRate,
int channels) throws IOException {
for (int i = 0; i < supportedMedia.size(); i++) {
MediaInfo mediaInfo = (MediaInfo) supportedMedia.get(i);
if (mediaInfo.getEncoding() == encoding &&
mediaInfo.getSampleRate() == sampleRate &&
mediaInfo.getChannels() == channels) {
return mediaInfo;
}
}
throw new IOException("Unsupported media " + encoding
+ "/" + sampleRate + "/" + channels);
}
public static MediaInfo findMediaInfo(byte payload) throws IOException {
for (int i = 0; i < supportedMedia.size(); i++) {
MediaInfo mediaInfo = (MediaInfo) supportedMedia.get(i);
if (mediaInfo.getPayload() == payload) {
return mediaInfo;
}
}
throw new IOException("Unsupported payload " + payload);
}
public byte getPayload() {
return payload;
}
public int getEncoding() {
return encoding;
}
public String getEncodingString() {
if (encoding == RtpPacket.PCMU_ENCODING) {
return "PCMU";
}
if (encoding == RtpPacket.PCM_ENCODING) {
return "PCM";
}
return "SPEEX";
}
public int getSampleRate() {
return sampleRate;
}
public int getChannels() {
return channels;
}
public int getSamplesPerPacket() {
return samplesPerPacket;
}
public boolean isTelephoneEventPayload() {
return isTelephoneEventPayload;
}
public String toString() {
String s = "PCMU";
if (encoding == RtpPacket.PCM_ENCODING) {
s = "PCM";
} else if (encoding == RtpPacket.SPEEX_ENCODING) {
s = "SPEEX";
}
return payload + ":" + s + "/" + sampleRate + "/" + channels;
}
}