1
0
Fork 0
mirror of https://github.com/vanitasvitae/Smack.git synced 2024-11-22 20:12:07 +01:00

Preferred Codec Added to Media Manager and Media Negotiator

git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@7585 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
Thiago Camargo 2007-03-17 20:13:05 +00:00 committed by thiago
parent c0ce7dd783
commit cb2df91084
5 changed files with 115 additions and 102 deletions

View file

@ -27,15 +27,15 @@ import java.util.List;
/** /**
* This class provides necessary Jingle Session jmf methods and behavior. * This class provides necessary Jingle Session jmf methods and behavior.
* * <p/>
* The goal of this class is to provide a flexible way to make JingleManager control jmf streaming APIs without implement them. * The goal of this class is to provide a flexible way to make JingleManager control jmf streaming APIs without implement them.
* For instance you can implement a file transfer using java sockets or a VOIP Media Manager using JMF. * For instance you can implement a file transfer using java sockets or a VOIP Media Manager using JMF.
* You can implement many JingleMediaManager according to you necessity. * You can implement many JingleMediaManager according to you necessity.
* *
* @author Thiago Camargo * @author Thiago Camargo
*/ */
public abstract class JingleMediaManager { public abstract class JingleMediaManager {
/** /**
* Return all supported Payloads for this Manager * Return all supported Payloads for this Manager
* *
@ -43,6 +43,15 @@ public abstract class JingleMediaManager {
*/ */
public abstract List<PayloadType> getPayloads(); public abstract List<PayloadType> getPayloads();
/**
* Returns the Preferred PayloadType of the Media Manager
*
* @return The PayloadType
*/
public PayloadType getPreferredPayloadType() {
return getPayloads().size() > 0 ? getPayloads().get(0) : null;
}
/** /**
* Create a Media Session Implementation * Create a Media Session Implementation
* *

View file

@ -211,27 +211,34 @@ public class MediaNegotiator extends JingleNegotiator {
if (!commonAudioPtsHere.isEmpty() && !commonAudioPtsThere.isEmpty()) { if (!commonAudioPtsHere.isEmpty() && !commonAudioPtsThere.isEmpty()) {
PayloadType.Audio bestPtHere = null; if (session.getInitiator().equals(session.getConnection().getUser())) {
PayloadType.Audio bestPtHere = null;
if (bestPtHere == null) PayloadType payload = this.session.getMediaManager().getPreferredPayloadType();
for (PayloadType payloadType : commonAudioPtsHere)
if (payload != null && payload instanceof PayloadType.Audio)
if (commonAudioPtsHere.contains(payload))
bestPtHere = (PayloadType.Audio) payload;
if (bestPtHere == null)
for (PayloadType payloadType : commonAudioPtsHere)
if (payloadType instanceof PayloadType.Audio) {
bestPtHere = (PayloadType.Audio) payloadType;
break;
}
result = bestPtHere;
}
else {
PayloadType.Audio bestPtThere = null;
for (PayloadType payloadType : commonAudioPtsThere)
if (payloadType instanceof PayloadType.Audio) { if (payloadType instanceof PayloadType.Audio) {
bestPtHere = (PayloadType.Audio) payloadType; bestPtThere = (PayloadType.Audio) payloadType;
break; break;
} }
PayloadType.Audio bestPtThere = null;
for (PayloadType payloadType : commonAudioPtsThere)
if (payloadType instanceof PayloadType.Audio) {
bestPtThere = (PayloadType.Audio) payloadType;
break;
}
if (session.getInitiator().equals(session.getConnection().getUser()))
result = bestPtHere;
else
result = bestPtThere; result = bestPtThere;
}
} }
} }

View file

@ -38,6 +38,8 @@ public class MultiMediaManager extends JingleMediaManager {
private List<JingleMediaManager> managers = new ArrayList<JingleMediaManager>(); private List<JingleMediaManager> managers = new ArrayList<JingleMediaManager>();
private PayloadType preferredPayloadType = null;
public MultiMediaManager() { public MultiMediaManager() {
} }
@ -56,9 +58,10 @@ public class MultiMediaManager extends JingleMediaManager {
*/ */
public List<PayloadType> getPayloads() { public List<PayloadType> getPayloads() {
List<PayloadType> list = new ArrayList<PayloadType>(); List<PayloadType> list = new ArrayList<PayloadType>();
if (preferredPayloadType != null) list.add(preferredPayloadType);
for (JingleMediaManager manager : managers) { for (JingleMediaManager manager : managers) {
for (PayloadType payloadType : manager.getPayloads()) { for (PayloadType payloadType : manager.getPayloads()) {
if (!list.contains(payloadType)) if (!list.contains(payloadType) && !payloadType.equals(preferredPayloadType))
list.add(payloadType); list.add(payloadType);
} }
} }
@ -69,8 +72,8 @@ public class MultiMediaManager extends JingleMediaManager {
* Returns a new JingleMediaSession * Returns a new JingleMediaSession
* *
* @param payloadType payloadType * @param payloadType payloadType
* @param remote remote Candidate * @param remote remote Candidate
* @param local local Candidate * @param local local Candidate
* @return JingleMediaSession JingleMediaSession * @return JingleMediaSession JingleMediaSession
*/ */
public JingleMediaSession createMediaSession(PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local) { public JingleMediaSession createMediaSession(PayloadType payloadType, final TransportCandidate remote, final TransportCandidate local) {
@ -81,4 +84,14 @@ public class MultiMediaManager extends JingleMediaManager {
} }
return null; return null;
} }
public PayloadType getPreferredPayloadType() {
if (preferredPayloadType != null) return preferredPayloadType;
return super.getPreferredPayloadType();
}
public void setPreferredPayloadType(PayloadType preferredPayloadType) {
this.preferredPayloadType = preferredPayloadType;
}
} }

View file

@ -259,14 +259,11 @@ public abstract class TransportCandidate {
public boolean isNull() { public boolean isNull() {
if (ip == null) { if (ip == null) {
return true; return true;
} } else if (ip.length() == 0) {
else if (ip.length() == 0) {
return true; return true;
} } else if (port < 0) {
else if (port < 0) {
return true; return true;
} } else {
else {
return false; return false;
} }
} }
@ -349,8 +346,7 @@ public abstract class TransportCandidate {
if (other.getIp() != null) { if (other.getIp() != null) {
return false; return false;
} }
} } else if (!getIp().equals(other.getIp())) {
else if (!getIp().equals(other.getIp())) {
return false; return false;
} }
@ -362,8 +358,7 @@ public abstract class TransportCandidate {
if (other.getName() != null) { if (other.getName() != null) {
return false; return false;
} }
} } else if (!getName().equals(other.getName())) {
else if (!getName().equals(other.getName())) {
return false; return false;
} }
if (getPort() != other.getPort()) { if (getPort() != other.getPort()) {
@ -507,20 +502,15 @@ public abstract class TransportCandidate {
value = value.toLowerCase(); value = value.toLowerCase();
if (value.equals("udp")) { if (value.equals("udp")) {
return UDP; return UDP;
} } else if (value.equals("tcp")) {
else if (value.equals("tcp")) {
return TCP; return TCP;
} } else if (value.equals("tcp-act")) {
else if (value.equals("tcp-act")) {
return TCPACT; return TCPACT;
} } else if (value.equals("tcp-pass")) {
else if (value.equals("tcp-pass")) {
return TCPPASS; return TCPPASS;
} } else if (value.equals("ssltcp")) {
else if (value.equals("ssltcp")) {
return SSLTCP; return SSLTCP;
} } else {
else {
return UDP; return UDP;
} }
} }
@ -545,8 +535,7 @@ public abstract class TransportCandidate {
if (other.value != null) { if (other.value != null) {
return false; return false;
} }
} } else if (!value.equals(other.value)) {
else if (!value.equals(other.value)) {
return false; return false;
} }
return true; return true;
@ -560,11 +549,9 @@ public abstract class TransportCandidate {
public boolean isNull() { public boolean isNull() {
if (value == null) { if (value == null) {
return true; return true;
} } else if (value.length() == 0) {
else if (value.length() == 0) {
return true; return true;
} } else {
else {
return false; return false;
} }
} }
@ -599,11 +586,9 @@ public abstract class TransportCandidate {
value = value.toLowerCase(); value = value.toLowerCase();
if (value.equals("myrtpvoice")) { if (value.equals("myrtpvoice")) {
return MYRTPVOICE; return MYRTPVOICE;
} } else if (value.equals("tcp")) {
else if (value.equals("tcp")) {
return MYRTCPVOICE; return MYRTCPVOICE;
} } else {
else {
return MYRTPVOICE; return MYRTPVOICE;
} }
} }
@ -628,8 +613,7 @@ public abstract class TransportCandidate {
if (other.value != null) { if (other.value != null) {
return false; return false;
} }
} } else if (!value.equals(other.value)) {
else if (!value.equals(other.value)) {
return false; return false;
} }
return true; return true;
@ -643,11 +627,9 @@ public abstract class TransportCandidate {
public boolean isNull() { public boolean isNull() {
if (value == null) { if (value == null) {
return true; return true;
} } else if (value.length() == 0) {
else if (value.length() == 0) {
return true; return true;
} } else {
else {
return false; return false;
} }
} }
@ -687,8 +669,7 @@ public abstract class TransportCandidate {
this.send = local.getBytes("UTF-8"); this.send = local.getBytes("UTF-8");
this.receive = remote.getBytes("UTF-8"); this.receive = remote.getBytes("UTF-8");
} } else {
else {
this.receive = local.getBytes("UTF-8"); this.receive = local.getBytes("UTF-8");
this.send = remote.getBytes("UTF-8"); this.send = remote.getBytes("UTF-8");
} }
@ -798,6 +779,7 @@ public abstract class TransportCandidate {
public boolean datagramReceived(DatagramPacket datagramPacket) { public boolean datagramReceived(DatagramPacket datagramPacket) {
try { try {
System.out.println("Content Received: " + new String(datagramPacket.getData(), "UTF-8"));
String str[] = new String(datagramPacket.getData(), "UTF-8").split(";"); String str[] = new String(datagramPacket.getData(), "UTF-8").split(";");
String pass = str[0]; String pass = str[0];
String addr[] = str[1].split(":"); String addr[] = str[1].split(":");

View file

@ -56,57 +56,57 @@ public class JingleMediaTest extends SmackTestCase {
XMPPConnection x0 = getConnection(0); XMPPConnection x0 = getConnection(0);
XMPPConnection x1 = getConnection(1); XMPPConnection x1 = getConnection(1);
for(int i=0;i<3;i++) for (int i = 0; i < 3; i++)
try { try {
ICETransportManager icetm0 = new ICETransportManager(x0, "jivesoftware.com", 3478); ICETransportManager icetm0 = new ICETransportManager(x0, "jivesoftware.com", 3478);
ICETransportManager icetm1 = new ICETransportManager(x1, "jivesoftware.com", 3478); ICETransportManager icetm1 = new ICETransportManager(x1, "jivesoftware.com", 3478);
final JingleManager jm0 = new JingleManager( final JingleManager jm0 = new JingleManager(
x0, icetm0); x0, icetm0);
final JingleManager jm1 = new JingleManager( final JingleManager jm1 = new JingleManager(
x1, icetm1); x1, icetm1);
jm0.addCreationListener(icetm0); jm0.addCreationListener(icetm0);
jm1.addCreationListener(icetm1); jm1.addCreationListener(icetm1);
JingleMediaManager jingleMediaManager0 = new JmfMediaManager(); JingleMediaManager jingleMediaManager0 = new JmfMediaManager();
JingleMediaManager jingleMediaManager1 = new JmfMediaManager(); JingleMediaManager jingleMediaManager1 = new JmfMediaManager();
jm0.setMediaManager(jingleMediaManager0); jm0.setMediaManager(jingleMediaManager0);
jm1.setMediaManager(jingleMediaManager1); jm1.setMediaManager(jingleMediaManager1);
JingleSessionRequestListener jingleSessionRequestListener = new JingleSessionRequestListener() { JingleSessionRequestListener jingleSessionRequestListener = new JingleSessionRequestListener() {
public void sessionRequested(final JingleSessionRequest request) { public void sessionRequested(final JingleSessionRequest request) {
try {
IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads());
session.start(request);
}
catch (XMPPException e) {
e.printStackTrace();
}
try {
IncomingJingleSession session = request.accept(jm1.getMediaManager().getPayloads());
session.start(request);
}
catch (XMPPException e) {
e.printStackTrace();
} }
};
} jm1.addJingleSessionRequestListener(jingleSessionRequestListener);
};
jm1.addJingleSessionRequestListener(jingleSessionRequestListener); OutgoingJingleSession js0 = jm0.createOutgoingJingleSession(x1.getUser());
OutgoingJingleSession js0 = jm0.createOutgoingJingleSession(x1.getUser()); js0.start();
js0.start(); Thread.sleep(50000);
js0.terminate();
Thread.sleep(50000); jm1.removeJingleSessionRequestListener(jingleSessionRequestListener);
js0.terminate();
jm1.removeJingleSessionRequestListener(jingleSessionRequestListener); Thread.sleep(6000);
Thread.sleep(6000); }
catch (Exception e) {
} e.printStackTrace();
catch (Exception e) { }
e.printStackTrace();
}
} }
@ -128,19 +128,21 @@ public class JingleMediaTest extends SmackTestCase {
jm0.addCreationListener(icetm0); jm0.addCreationListener(icetm0);
jm1.addCreationListener(icetm1); jm1.addCreationListener(icetm1);
/*
final JingleManager jm0 = new JingleManager( /*
x0, new BasicTransportManager()); final JingleManager jm0 = new JingleManager(
final JingleManager jm1 = new JingleManager( x0, new BasicTransportManager());
x1, new BasicTransportManager()); final JingleManager jm1 = new JingleManager(
*/ x1, new BasicTransportManager());
*/
MultiMediaManager jingleMediaManager0 = new MultiMediaManager(); MultiMediaManager jingleMediaManager0 = new MultiMediaManager();
jingleMediaManager0.addMediaManager(new SpeexMediaManager());
jingleMediaManager0.addMediaManager(new JmfMediaManager()); jingleMediaManager0.addMediaManager(new JmfMediaManager());
jingleMediaManager0.addMediaManager(new SpeexMediaManager());
MultiMediaManager jingleMediaManager1 = new MultiMediaManager(); MultiMediaManager jingleMediaManager1 = new MultiMediaManager();
jingleMediaManager1.addMediaManager(new JmfMediaManager()); jingleMediaManager1.addMediaManager(new JmfMediaManager());
jingleMediaManager1.addMediaManager(new SpeexMediaManager()); jingleMediaManager1.addMediaManager(new SpeexMediaManager());
jingleMediaManager1.setPreferredPayloadType(jingleMediaManager1.getPayloads().get(2));
jm0.setMediaManager(jingleMediaManager0); jm0.setMediaManager(jingleMediaManager0);
jm1.setMediaManager(jingleMediaManager1); jm1.setMediaManager(jingleMediaManager1);