mirror of
https://github.com/moonlight-stream/moonlight-android.git
synced 2025-07-23 13:02:45 +00:00
Fix video stream reception. Remove debugging info.
This commit is contained in:
parent
fbbf572c9d
commit
3aad899a07
@ -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);
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
@ -47,6 +48,31 @@ public class NvAudioStream {
|
|||||||
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 (;;)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
@ -151,11 +151,11 @@ public class NvControl {
|
|||||||
(int)0xFE000000
|
(int)0xFE000000
|
||||||
};
|
};
|
||||||
|
|
||||||
public static final short PTYPE_HELLO = 0x1204;
|
|
||||||
public static final short PPAYLEN_HELLO = 0x0004;
|
public static final short PTYPE_JITTER = 0x140c;
|
||||||
public static final byte[] PPAYLOAD_HELLO = new byte[] {
|
public static final short PPAYLEN_JITTER = 0x10;
|
||||||
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();
|
||||||
|
@ -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) {
|
||||||
@ -50,6 +59,32 @@ public class NvVideoStream {
|
|||||||
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 (;;)
|
||||||
{
|
{
|
||||||
DatagramPacket dp = new DatagramPacket(new byte[1500], 1500);
|
DatagramPacket dp = new DatagramPacket(new byte[1500], 1500);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user