mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2026-06-17 14:21:30 +00:00
Increase the receive window size. Fix endianness issue with RTP sequence numbers. More bug fixes!
This commit is contained in:
@@ -27,23 +27,23 @@ static int byteSwapShort(PBYTE_BUFFER buff, short s) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int BbGet(PBYTE_BUFFER buff, char *c) {
|
int BbGet(PBYTE_BUFFER buff, char *c) {
|
||||||
if (buff->position + sizeof(c) >= buff->length) {
|
if (buff->position + sizeof(*c) > buff->length) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(c, &buff->buffer[buff->position], sizeof(*c));
|
memcpy(c, &buff->buffer[buff->position], sizeof(*c));
|
||||||
buff->position += sizeof(c);
|
buff->position += sizeof(*c);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int BbGetShort(PBYTE_BUFFER buff, short *s) {
|
int BbGetShort(PBYTE_BUFFER buff, short *s) {
|
||||||
if (buff->position + sizeof(s) >= buff->length) {
|
if (buff->position + sizeof(*s) >= buff->length) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(s, &buff->buffer[buff->position], sizeof(*s));
|
memcpy(s, &buff->buffer[buff->position], sizeof(*s));
|
||||||
buff->position += sizeof(s);
|
buff->position += sizeof(*s);
|
||||||
|
|
||||||
*s = byteSwapShort(buff, *s);
|
*s = byteSwapShort(buff, *s);
|
||||||
|
|
||||||
@@ -51,12 +51,12 @@ int BbGetShort(PBYTE_BUFFER buff, short *s) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int BbGetInt(PBYTE_BUFFER buff, int *i) {
|
int BbGetInt(PBYTE_BUFFER buff, int *i) {
|
||||||
if (buff->position + sizeof(i) >= buff->length) {
|
if (buff->position + sizeof(*i) > buff->length) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(i, &buff->buffer[buff->position], sizeof(*i));
|
memcpy(i, &buff->buffer[buff->position], sizeof(*i));
|
||||||
buff->position += sizeof(i);
|
buff->position += sizeof(*i);
|
||||||
|
|
||||||
*i = byteSwapInt(buff, *i);
|
*i = byteSwapInt(buff, *i);
|
||||||
|
|
||||||
@@ -64,7 +64,7 @@ int BbGetInt(PBYTE_BUFFER buff, int *i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int BbPutInt(PBYTE_BUFFER buff, int i) {
|
int BbPutInt(PBYTE_BUFFER buff, int i) {
|
||||||
if (buff->position + sizeof(i) >= buff->length) {
|
if (buff->position + sizeof(i) > buff->length) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -77,7 +77,7 @@ int BbPutInt(PBYTE_BUFFER buff, int i) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int BbPutShort(PBYTE_BUFFER buff, short s) {
|
int BbPutShort(PBYTE_BUFFER buff, short s) {
|
||||||
if (buff->position + sizeof(s) >= buff->length) {
|
if (buff->position + sizeof(s) > buff->length) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ int BbPutShort(PBYTE_BUFFER buff, short s) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int BbPut(PBYTE_BUFFER buff, char c) {
|
int BbPut(PBYTE_BUFFER buff, char c) {
|
||||||
if (buff->position + sizeof(c) >= buff->length) {
|
if (buff->position + sizeof(c) > buff->length) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
#include "PlatformSockets.h"
|
#include "PlatformSockets.h"
|
||||||
|
#include "Limelight.h"
|
||||||
|
|
||||||
SOCKET bindUdpSocket(unsigned short port) {
|
SOCKET bindUdpSocket(unsigned short port) {
|
||||||
SOCKET s;
|
SOCKET s;
|
||||||
struct sockaddr_in addr;
|
struct sockaddr_in addr;
|
||||||
|
int val;
|
||||||
|
|
||||||
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
|
||||||
if (s == INVALID_SOCKET) {
|
if (s == INVALID_SOCKET) {
|
||||||
@@ -17,6 +19,9 @@ SOCKET bindUdpSocket(unsigned short port) {
|
|||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val = 65536;
|
||||||
|
int err = setsockopt(s, SOL_SOCKET, SO_RCVBUF, (char*) &val, sizeof(val));
|
||||||
|
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -208,6 +208,9 @@ void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void queueRtpPacket(PRTP_PACKET rtpPacket, int length) {
|
void queueRtpPacket(PRTP_PACKET rtpPacket, int length) {
|
||||||
|
|
||||||
|
rtpPacket->sequenceNumber = htons(rtpPacket->sequenceNumber);
|
||||||
|
|
||||||
if (lastSequenceNumber != 0 &&
|
if (lastSequenceNumber != 0 &&
|
||||||
(unsigned short) (lastSequenceNumber + 1) != rtpPacket->sequenceNumber) {
|
(unsigned short) (lastSequenceNumber + 1) != rtpPacket->sequenceNumber) {
|
||||||
Limelog("Received OOS video data (expected %d, but got %d)\n", lastSequenceNumber + 1, rtpPacket->sequenceNumber);
|
Limelog("Received OOS video data (expected %d, but got %d)\n", lastSequenceNumber + 1, rtpPacket->sequenceNumber);
|
||||||
|
|||||||
@@ -61,10 +61,13 @@ static void ReceiveThreadProc(void* context) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
queueRtpPacket((PRTP_PACKET) &buffer[sizeof(int)], err);
|
||||||
|
|
||||||
memcpy(buffer, &err, sizeof(err));
|
memcpy(buffer, &err, sizeof(err));
|
||||||
|
|
||||||
if (!offerQueueItem(&packetQueue, buffer)) {
|
if (!offerQueueItem(&packetQueue, buffer)) {
|
||||||
free(buffer);
|
free(buffer);
|
||||||
|
Limelog("Packet queue overflow\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,6 +104,7 @@ int readFirstFrame(void) {
|
|||||||
return LastSocketError();
|
return LastSocketError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Limelog("Waiting for first frame\n");
|
||||||
for (;;) {
|
for (;;) {
|
||||||
err = recv(s, &firstFrame[offset], sizeof(firstFrame) - offset, 0);
|
err = recv(s, &firstFrame[offset], sizeof(firstFrame) - offset, 0);
|
||||||
if (err <= 0) {
|
if (err <= 0) {
|
||||||
@@ -109,6 +113,7 @@ int readFirstFrame(void) {
|
|||||||
|
|
||||||
offset += err;
|
offset += err;
|
||||||
}
|
}
|
||||||
|
Limelog("Read %d bytes\n", offset);
|
||||||
|
|
||||||
processRtpPayload((PNV_VIDEO_PACKET) firstFrame, offset);
|
processRtpPayload((PNV_VIDEO_PACKET) firstFrame, offset);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user