Fix video stream reception. Remove debugging info.

This commit is contained in:
Cameron Gutman 2013-09-22 03:22:58 -04:00
parent fbbf572c9d
commit 3aad899a07
5 changed files with 125 additions and 65 deletions

View File

@ -45,63 +45,48 @@ public class Game extends Activity {
@Override @Override
public boolean onKeyDown(int keyCode, KeyEvent event) { public boolean onKeyDown(int keyCode, KeyEvent event) {
// int player = OuyaController.getPlayerNumByDeviceId(event.getDeviceId());
switch (keyCode) { switch (keyCode) {
case OuyaController.BUTTON_MENU: case OuyaController.BUTTON_MENU:
System.out.println("Pressed Menu Button"); inputMap |= NvInputPacket.BACK_FLAG;
inputMap |= NvInputPacket.PLAY_FLAG;
break; break;
case OuyaController.BUTTON_DPAD_LEFT: case OuyaController.BUTTON_DPAD_LEFT:
System.out.println("Pressed Dpad Left");
inputMap |= NvInputPacket.LEFT_FLAG; inputMap |= NvInputPacket.LEFT_FLAG;
break; break;
case OuyaController.BUTTON_DPAD_RIGHT: case OuyaController.BUTTON_DPAD_RIGHT:
System.out.println("Pressed Dpad Right");
inputMap |= NvInputPacket.RIGHT_FLAG; inputMap |= NvInputPacket.RIGHT_FLAG;
break; break;
case OuyaController.BUTTON_DPAD_UP: case OuyaController.BUTTON_DPAD_UP:
System.out.println("Pressed Dpad Up");
inputMap |= NvInputPacket.UP_FLAG; inputMap |= NvInputPacket.UP_FLAG;
break; break;
case OuyaController.BUTTON_DPAD_DOWN: case OuyaController.BUTTON_DPAD_DOWN:
System.out.println("Pressed Dpad Down");
inputMap |= NvInputPacket.DOWN_FLAG; inputMap |= NvInputPacket.DOWN_FLAG;
break; break;
case OuyaController.BUTTON_A: case OuyaController.BUTTON_A:
System.out.println("Pressed A");
inputMap |= NvInputPacket.B_FLAG; inputMap |= NvInputPacket.B_FLAG;
break; break;
case OuyaController.BUTTON_O: case OuyaController.BUTTON_O:
System.out.println("Pressed O");
inputMap |= NvInputPacket.A_FLAG; inputMap |= NvInputPacket.A_FLAG;
break; break;
case OuyaController.BUTTON_U: case OuyaController.BUTTON_U:
System.out.println("Pressed U");
inputMap |= NvInputPacket.X_FLAG; inputMap |= NvInputPacket.X_FLAG;
break; break;
case OuyaController.BUTTON_Y: case OuyaController.BUTTON_Y:
System.out.println("Pressed Y");
inputMap |= NvInputPacket.Y_FLAG; inputMap |= NvInputPacket.Y_FLAG;
break; break;
case OuyaController.BUTTON_L1: case OuyaController.BUTTON_L1:
System.out.println("Pressed L1");
inputMap |= NvInputPacket.LB_FLAG; inputMap |= NvInputPacket.LB_FLAG;
break; break;
case OuyaController.BUTTON_R1: case OuyaController.BUTTON_R1:
System.out.println("Pressed R1");
inputMap |= NvInputPacket.RB_FLAG; inputMap |= NvInputPacket.RB_FLAG;
break; break;
case OuyaController.BUTTON_L3: case OuyaController.BUTTON_L3:
System.out.println("Pressed L3");
inputMap |= NvInputPacket.LS_CLK_FLAG; inputMap |= NvInputPacket.LS_CLK_FLAG;
break; break;
case OuyaController.BUTTON_R3: case OuyaController.BUTTON_R3:
System.out.println("Pressed R3");
inputMap |= NvInputPacket.RS_CLK_FLAG; inputMap |= NvInputPacket.RS_CLK_FLAG;
break; break;
default: default:
System.out.println("Pressed some button: " + keyCode);
return super.onKeyDown(keyCode, event); return super.onKeyDown(keyCode, event);
} }
sendInputPacket(); sendInputPacket();
@ -112,59 +97,45 @@ public class Game extends Activity {
public boolean onKeyUp(int keyCode, KeyEvent event) { public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) { switch (keyCode) {
case OuyaController.BUTTON_MENU: case OuyaController.BUTTON_MENU:
System.out.println("Released Menu Button"); inputMap &= ~NvInputPacket.BACK_FLAG;
inputMap &= ~NvInputPacket.PLAY_FLAG;
break; break;
case OuyaController.BUTTON_DPAD_LEFT: case OuyaController.BUTTON_DPAD_LEFT:
System.out.println("Released Dpad Left");
inputMap &= ~NvInputPacket.LEFT_FLAG; inputMap &= ~NvInputPacket.LEFT_FLAG;
break; break;
case OuyaController.BUTTON_DPAD_RIGHT: case OuyaController.BUTTON_DPAD_RIGHT:
System.out.println("Released Dpad Right");
inputMap &= ~NvInputPacket.RIGHT_FLAG; inputMap &= ~NvInputPacket.RIGHT_FLAG;
break; break;
case OuyaController.BUTTON_DPAD_UP: case OuyaController.BUTTON_DPAD_UP:
System.out.println("Released Dpad Up");
inputMap &= ~NvInputPacket.UP_FLAG; inputMap &= ~NvInputPacket.UP_FLAG;
break; break;
case OuyaController.BUTTON_DPAD_DOWN: case OuyaController.BUTTON_DPAD_DOWN:
System.out.println("Released Dpad Down");
inputMap &= ~NvInputPacket.DOWN_FLAG; inputMap &= ~NvInputPacket.DOWN_FLAG;
break; break;
case OuyaController.BUTTON_A: case OuyaController.BUTTON_A:
System.out.println("Released A");
inputMap &= ~NvInputPacket.B_FLAG; inputMap &= ~NvInputPacket.B_FLAG;
break; break;
case OuyaController.BUTTON_O: case OuyaController.BUTTON_O:
System.out.println("Released O");
inputMap &= ~NvInputPacket.A_FLAG; inputMap &= ~NvInputPacket.A_FLAG;
break; break;
case OuyaController.BUTTON_U: case OuyaController.BUTTON_U:
System.out.println("Released U");
inputMap &= ~NvInputPacket.X_FLAG; inputMap &= ~NvInputPacket.X_FLAG;
break; break;
case OuyaController.BUTTON_Y: case OuyaController.BUTTON_Y:
System.out.println("Released Y");
inputMap &= ~NvInputPacket.Y_FLAG; inputMap &= ~NvInputPacket.Y_FLAG;
break; break;
case OuyaController.BUTTON_L1: case OuyaController.BUTTON_L1:
System.out.println("Released L1");
inputMap &= ~NvInputPacket.LB_FLAG; inputMap &= ~NvInputPacket.LB_FLAG;
break; break;
case OuyaController.BUTTON_R1: case OuyaController.BUTTON_R1:
System.out.println("Released R1");
inputMap &= ~NvInputPacket.RB_FLAG; inputMap &= ~NvInputPacket.RB_FLAG;
break; break;
case OuyaController.BUTTON_L3: case OuyaController.BUTTON_L3:
System.out.println("Released L3");
inputMap &= ~NvInputPacket.LS_CLK_FLAG; inputMap &= ~NvInputPacket.LS_CLK_FLAG;
break; break;
case OuyaController.BUTTON_R3: case OuyaController.BUTTON_R3:
System.out.println("Released R3");
inputMap &= ~NvInputPacket.RS_CLK_FLAG; inputMap &= ~NvInputPacket.RS_CLK_FLAG;
break; break;
default: default:
System.out.println("Released some button: " + keyCode);
return super.onKeyUp(keyCode, event); return super.onKeyUp(keyCode, event);
} }
sendInputPacket(); sendInputPacket();
@ -188,25 +159,16 @@ public class Game extends Activity {
RS_X = RS_Y = 0.0f; RS_X = RS_Y = 0.0f;
} }
System.out.println("LS_X: " + LS_X + "\t" +
"LS_Y: " + LS_Y + "\t" +
"RS_X: " + RS_X + "\t" +
"RS_Y: " + RS_Y + "\t");
leftStickX = (short)Math.round(LS_X * 0x7FFF); leftStickX = (short)Math.round(LS_X * 0x7FFF);
leftStickY = (short)Math.round(-LS_Y * 0x7FFF); leftStickY = (short)Math.round(-LS_Y * 0x7FFF);
rightStickX = (short)Math.round(RS_X * 0x7FFF); rightStickX = (short)Math.round(RS_X * 0x7FFF);
rightStickY = (short)Math.round(-RS_Y * 0x7FFF); rightStickY = (short)Math.round(-RS_Y * 0x7FFF);
}
System.out.printf("(0x%x 0x%x) (0x%x 0x%x)\n", leftStickX, leftStickY, rightStickX, rightStickY);
}
float L2 = event.getAxisValue(OuyaController.AXIS_L2); float L2 = event.getAxisValue(OuyaController.AXIS_L2);
float R2 = event.getAxisValue(OuyaController.AXIS_R2); float R2 = event.getAxisValue(OuyaController.AXIS_R2);
System.out.println("L2: " + L2 + "\t" + " R2: " + R2 + "\t");
leftTrigger = (byte)Math.round(L2 * 0xFF); leftTrigger = (byte)Math.round(L2 * 0xFF);
rightTrigger = (byte)Math.round(R2 * 0xFF); rightTrigger = (byte)Math.round(R2 * 0xFF);

View File

@ -3,6 +3,7 @@ package com.limelight.nvstream;
import java.io.IOException; import java.io.IOException;
import java.net.DatagramPacket; import java.net.DatagramPacket;
import java.net.DatagramSocket; import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException; import java.net.SocketException;
import android.net.rtp.AudioGroup; import android.net.rtp.AudioGroup;
import android.net.rtp.AudioStream; import android.net.rtp.AudioStream;
@ -32,13 +33,13 @@ public class NvAudioStream {
System.out.println("Joined"); System.out.println("Joined");
}*/ }*/
public void start() public void start(final String host)
{ {
new Thread(new Runnable() { new Thread(new Runnable() {
@Override @Override
public void run() { public void run() {
DatagramSocket ds; final DatagramSocket ds;
try { try {
ds = new DatagramSocket(PORT); ds = new DatagramSocket(PORT);
} catch (SocketException e1) { } catch (SocketException e1) {
@ -46,6 +47,31 @@ public class NvAudioStream {
e1.printStackTrace(); e1.printStackTrace();
return; return;
} }
new Thread(new Runnable() {
@Override
public void run() {
byte[] ping = new byte[]{0x50, 0x49, 0x4e, 0x47};
for (;;)
{
DatagramPacket dgp = new DatagramPacket(ping, 0, ping.length);
dgp.setSocketAddress(new InetSocketAddress(host, PORT));
try {
ds.send(dgp);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}
}
}
}).start();
for (;;) for (;;)
{ {

View File

@ -49,6 +49,12 @@ public class NvConnection {
performHandshake(); performHandshake();
beginControlStream(); beginControlStream();
startController(); startController();
//new NvAudioStream().start();
new NvVideoStream().start(host);
controlStream.startJitterPackets();
} catch (XmlPullParserException e) { } catch (XmlPullParserException e) {
e.printStackTrace(); e.printStackTrace();
displayToast(e.getMessage()); displayToast(e.getMessage());
@ -131,10 +137,4 @@ public class NvConnection {
System.out.println("Starting input"); System.out.println("Starting input");
inputStream = new NvController(host); inputStream = new NvController(host);
} }
public void doShit() throws XmlPullParserException, IOException
{
new NvAudioStream().start();
new NvVideoStream().start(host);
}
} }

View File

@ -12,9 +12,9 @@ public class NvControl {
public static final int PORT = 47995; public static final int PORT = 47995;
public static final short PTYPE_1 = 0x1204; public static final short PTYPE_HELLO = 0x1204;
public static final short PPAYLEN_1 = 0x0004; public static final short PPAYLEN_HELLO = 0x0004;
public static final byte[] PPAYLOAD_1 = public static final byte[] PPAYLOAD_HELLO =
{ {
(byte)0x00, (byte)0x00,
(byte)0x05, (byte)0x05,
@ -97,7 +97,7 @@ public class NvControl {
402653184, 402653184,
134218770, 134218770,
419430400, 419430400,
167773203, 167773202,
436207616, 436207616,
855638290, 855638290,
266779, 266779,
@ -150,12 +150,12 @@ public class NvControl {
34746368, 34746368,
(int)0xFE000000 (int)0xFE000000
}; };
public static final short PTYPE_HELLO = 0x1204; public static final short PTYPE_JITTER = 0x140c;
public static final short PPAYLEN_HELLO = 0x0004; public static final short PPAYLEN_JITTER = 0x10;
public static final byte[] PPAYLOAD_HELLO = new byte[] {
0x04, 0x00, 0x00, 0x05 private int seqNum;
};
private Socket s; private Socket s;
private InputStream in; private InputStream in;
@ -173,12 +173,25 @@ public class NvControl {
out.write(packet.toWire()); out.write(packet.toWire());
out.flush(); out.flush();
} }
public NvControl.NvCtlResponse sendAndGetReply(NvCtlPacket packet) throws IOException public NvControl.NvCtlResponse sendAndGetReply(NvCtlPacket packet) throws IOException
{ {
sendPacket(packet); sendPacket(packet);
return new NvCtlResponse(in); return new NvCtlResponse(in);
} }
private void sendJitter() throws IOException
{
ByteBuffer bb = ByteBuffer.allocate(16).order(ByteOrder.LITTLE_ENDIAN);
bb.putInt(0);
bb.putInt(77);
bb.putInt(888);
bb.putInt(seqNum += 2);
sendPacket(new NvCtlPacket(PTYPE_JITTER, PPAYLEN_JITTER, bb.array()));
}
public void beginControl() throws IOException public void beginControl() throws IOException
{ {
System.out.println("CTL: Sending hello"); System.out.println("CTL: Sending hello");
@ -215,6 +228,30 @@ public class NvControl {
}).start(); }).start();
} }
public void startJitterPackets()
{
new Thread(new Runnable() {
@Override
public void run() {
for (;;)
{
try {
sendJitter();
} catch (IOException e1) {
e1.printStackTrace();
break;
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
break;
}
}
}
}).start();
}
public void endControl() throws IOException public void endControl() throws IOException
{ {
s.close(); s.close();

View File

@ -4,6 +4,7 @@ import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.net.DatagramPacket; import java.net.DatagramPacket;
import java.net.DatagramSocket; import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.Socket; import java.net.Socket;
import java.net.SocketException; import java.net.SocketException;
import java.net.UnknownHostException; import java.net.UnknownHostException;
@ -27,10 +28,18 @@ public class NvVideoStream {
try { try {
System.out.println("VID: Waiting for first frame"); System.out.println("VID: Waiting for first frame");
InputStream firstFrameStream = getFirstFrame(host); InputStream firstFrameStream = getFirstFrame(host);
firstFrameStream.read();
System.out.println("VID: First frame: "+firstFrameStream.available()+1); System.out.println(firstFrameStream.available());
firstFrameStream.close(); int i;
System.out.println("VID: Got first frame"); for (i = 0; i < 98; i++)
{
if (firstFrameStream.read() == -1)
{
System.out.println("EOF on FF");
break;
}
}
System.out.println("VID: First frame read "+i);
} catch (UnknownHostException e2) { } catch (UnknownHostException e2) {
// TODO Auto-generated catch block // TODO Auto-generated catch block
e2.printStackTrace(); e2.printStackTrace();
@ -41,7 +50,7 @@ public class NvVideoStream {
return; return;
} }
DatagramSocket ds; final DatagramSocket ds;
try { try {
ds = new DatagramSocket(PORT); ds = new DatagramSocket(PORT);
} catch (SocketException e1) { } catch (SocketException e1) {
@ -49,6 +58,32 @@ public class NvVideoStream {
e1.printStackTrace(); e1.printStackTrace();
return; return;
} }
// Ping thread
/*new Thread(new Runnable() {
@Override
public void run() {
byte[] ping = new byte[]{0x50, 0x49, 0x4e, 0x47};
for (;;)
{
DatagramPacket dgp = new DatagramPacket(ping, 0, ping.length);
dgp.setSocketAddress(new InetSocketAddress(host, PORT));
try {
ds.send(dgp);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
break;
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
break;
}
}
}
}).start();*/
for (;;) for (;;)
{ {