Changed the streaming to use UDP.

This commit is contained in:
2014-01-15 14:50:54 -04:30
parent c6f310884a
commit da044c5b1c
2 changed files with 82 additions and 6 deletions

View File

@@ -78,7 +78,7 @@ public class NxtARCore implements ApplicationListener, NetworkConnectionListener
fps = new FPSLogger(); fps = new FPSLogger();
font = new BitmapFont(); font = new BitmapFont();
//Gdx.app.setLogLevel(Application.LOG_NONE); Gdx.app.setLogLevel(Application.LOG_DEBUG);
camera = new OrthographicCamera(1, h/w); camera = new OrthographicCamera(1, h/w);
batch = new SpriteBatch(); batch = new SpriteBatch();

View File

@@ -15,17 +15,18 @@
*/ */
package ve.ucv.ciens.ccg.nxtar.network; package ve.ucv.ciens.ccg.nxtar.network;
import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.ObjectInputStream; import java.io.ObjectInputStream;
import java.io.ObjectOutputStream; import java.io.ObjectOutputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.ServerSocket; import java.net.ServerSocket;
import java.net.Socket; import java.net.Socket;
import ve.ucv.ciens.ccg.networkdata.VideoFrameDataMessage; import ve.ucv.ciens.ccg.networkdata.VideoFrameDataMessage;
import ve.ucv.ciens.ccg.networkdata.VideoStreamingControlMessage;
import ve.ucv.ciens.ccg.nxtar.interfaces.NetworkConnectionListener; import ve.ucv.ciens.ccg.nxtar.interfaces.NetworkConnectionListener;
import ve.ucv.ciens.ccg.nxtar.interfaces.Toaster; import ve.ucv.ciens.ccg.nxtar.interfaces.Toaster;
import ve.ucv.ciens.ccg.nxtar.network.protocols.VideoStreamingProtocol;
import ve.ucv.ciens.ccg.nxtar.utils.ProjectConstants; import ve.ucv.ciens.ccg.nxtar.utils.ProjectConstants;
import com.badlogic.gdx.Gdx; import com.badlogic.gdx.Gdx;
@@ -39,6 +40,7 @@ public class VideoStreamingThread extends Thread {
private NetworkConnectionListener netListener; private NetworkConnectionListener netListener;
private ServerSocket server; private ServerSocket server;
private DatagramSocket socket;
private Toaster toaster; private Toaster toaster;
private ProtocolState_t protocolState; private ProtocolState_t protocolState;
private boolean protocolStarted; private boolean protocolStarted;
@@ -71,6 +73,7 @@ public class VideoStreamingThread extends Thread {
try{ try{
server = new ServerSocket(ProjectConstants.SERVER_TCP_PORT_1); server = new ServerSocket(ProjectConstants.SERVER_TCP_PORT_1);
socket = new DatagramSocket(ProjectConstants.SERVER_TCP_PORT_2);
}catch(IOException io){ }catch(IOException io){
Gdx.app.error(TAG, CLASS_NAME + ".VideoStreamingThread() :: Error creating server: " + io.getMessage(), io); Gdx.app.error(TAG, CLASS_NAME + ".VideoStreamingThread() :: Error creating server: " + io.getMessage(), io);
} }
@@ -336,6 +339,77 @@ public class VideoStreamingThread extends Thread {
} }
} }
private int byteArray2Int(byte[] array){
int number = 0;
for(int i = 0; i < 4; i++){
number |= (array[3-i] & 0xff) << (i << 3);
}
return number;
}
private void receiveUdp(){
try{
int intSize;
byte[] size = new byte[4];
byte[] data;
DatagramPacket packet;
VideoFrameDataMessage dataMessage;
Object tmpMessage;
Gdx.app.debug(TAG, CLASS_NAME + ".receiveUdp() :: Reading message size from socket.");
try{
packet = new DatagramPacket(size, size.length);
socket.receive(packet);
}catch(IOException io){
Gdx.app.error(TAG, CLASS_NAME + ".receiveUdp() :: IOException receiving size " + io.getMessage());
return;
}
Gdx.app.debug(TAG, CLASS_NAME + ".receiveUdp() :: Creating buffers.");
intSize = byteArray2Int(size);
data = new byte[intSize];
Gdx.app.debug(TAG, CLASS_NAME + ".receiveUdp() :: Reading message from socket.");
try{
packet = new DatagramPacket(data, data.length);
socket.receive(packet);
}catch(IOException io){
Gdx.app.error(TAG, CLASS_NAME + ".receiveUdp() :: IOException receiving data " + io.getMessage());
return;
}
ByteArrayInputStream bais = new ByteArrayInputStream(data);
Gdx.app.debug(TAG, CLASS_NAME + ".receiveUdp() :: Saving message in monitor.");
try{
ObjectInputStream ois = new ObjectInputStream(bais);
tmpMessage = ois.readObject();
if(tmpMessage instanceof VideoFrameDataMessage){
Gdx.app.debug(TAG, CLASS_NAME + ".receiveUdp() :: Received a data message.");
dataMessage = (VideoFrameDataMessage) tmpMessage;
Gdx.app.debug(TAG, CLASS_NAME + ".receiveUdp() :: Received frame dimensions are: " +
Integer.toString(dataMessage.imageWidth) + "x" + Integer.toString(dataMessage.imageHeight));
frameMonitor.setFrameDimensions(dataMessage.imageWidth, dataMessage.imageHeight);
frameMonitor.setNewFrame(dataMessage.data);
}else{
Gdx.app.debug(TAG, CLASS_NAME + ".receiveUdp() :: Received something unknown.");
}
}catch(IOException io){
Gdx.app.error(TAG, CLASS_NAME + ".receiveUdp() :: IOException received deserializing message " + io.getMessage());
return;
}catch(ClassNotFoundException cn){
Gdx.app.error(TAG, CLASS_NAME + ".receiveUdp() :: ClassNotFoundException received " + cn.getMessage());
return;
}
}catch(Exception e){
Gdx.app.error(TAG, CLASS_NAME + ".receiveUdp() :: Exception received " + e.getMessage());
return;
}
}
public int getFps(){ public int getFps(){
return fps; return fps;
} }
@@ -362,7 +436,9 @@ public class VideoStreamingThread extends Thread {
then = System.currentTimeMillis(); then = System.currentTimeMillis();
while(!done){ while(!done){
receiveImage(); //receiveImage();
Gdx.app.debug(TAG, CLASS_NAME + ".run() :: Receiving.");
receiveUdp();
frames++; frames++;
now = System.currentTimeMillis(); now = System.currentTimeMillis();
delta = now - then; delta = now - then;