mirror of
https://github.com/moonlight-stream/moonlight-common-c.git
synced 2025-08-17 17:05:50 +00:00
Improve debugging and error codes
This commit is contained in:
parent
fc68cfd438
commit
a5f59d206e
@ -68,7 +68,7 @@ static void UdpPingThreadProc(void *context) {
|
|||||||
while (!PltIsThreadInterrupted(&udpPingThread)) {
|
while (!PltIsThreadInterrupted(&udpPingThread)) {
|
||||||
err = sendto(rtpSocket, pingData, sizeof(pingData), 0, (struct sockaddr*)&saddr, RemoteAddrLen);
|
err = sendto(rtpSocket, pingData, sizeof(pingData), 0, (struct sockaddr*)&saddr, RemoteAddrLen);
|
||||||
if (err != sizeof(pingData)) {
|
if (err != sizeof(pingData)) {
|
||||||
Limelog("UDP ping thread terminating #1\n");
|
Limelog("Audio Ping: sendto() failed: %d\n", (int)LastSocketError());
|
||||||
ListenerCallbacks.connectionTerminated(LastSocketError());
|
ListenerCallbacks.connectionTerminated(LastSocketError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -90,7 +90,6 @@ static int queuePacketToLbq(PQUEUED_AUDIO_PACKET *packet) {
|
|||||||
freePacketList(LbqFlushQueueItems(&packetQueue));
|
freePacketList(LbqFlushQueueItems(&packetQueue));
|
||||||
}
|
}
|
||||||
else if (err == LBQ_INTERRUPTED) {
|
else if (err == LBQ_INTERRUPTED) {
|
||||||
Limelog("Receive thread terminating #3\n");
|
|
||||||
free(*packet);
|
free(*packet);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -109,7 +108,7 @@ static void ReceiveThreadProc(void* context) {
|
|||||||
if (packet == NULL) {
|
if (packet == NULL) {
|
||||||
packet = (PQUEUED_AUDIO_PACKET) malloc(sizeof(*packet));
|
packet = (PQUEUED_AUDIO_PACKET) malloc(sizeof(*packet));
|
||||||
if (packet == NULL) {
|
if (packet == NULL) {
|
||||||
Limelog("Receive thread terminating\n");
|
Limelog("Audio Receive: malloc() failed\n");
|
||||||
ListenerCallbacks.connectionTerminated(-1);
|
ListenerCallbacks.connectionTerminated(-1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -117,7 +116,7 @@ static void ReceiveThreadProc(void* context) {
|
|||||||
|
|
||||||
packet->size = (int) recv(rtpSocket, &packet->data[0], MAX_PACKET_SIZE, 0);
|
packet->size = (int) recv(rtpSocket, &packet->data[0], MAX_PACKET_SIZE, 0);
|
||||||
if (packet->size <= 0) {
|
if (packet->size <= 0) {
|
||||||
Limelog("Receive thread terminating #2\n");
|
Limelog("Audio Receive: recv() failed: %d\n", (int)LastSocketError());
|
||||||
free(packet);
|
free(packet);
|
||||||
ListenerCallbacks.connectionTerminated(LastSocketError());
|
ListenerCallbacks.connectionTerminated(LastSocketError());
|
||||||
return;
|
return;
|
||||||
@ -172,7 +171,7 @@ static void DecoderThreadProc(void* context) {
|
|||||||
while (!PltIsThreadInterrupted(&decoderThread)) {
|
while (!PltIsThreadInterrupted(&decoderThread)) {
|
||||||
err = LbqWaitForQueueElement(&packetQueue, (void**) &packet);
|
err = LbqWaitForQueueElement(&packetQueue, (void**) &packet);
|
||||||
if (err != LBQ_SUCCESS) {
|
if (err != LBQ_SUCCESS) {
|
||||||
Limelog("Decoder thread terminating\n");
|
// An exit signal was received
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,7 +216,7 @@ int startAudioStream(void) {
|
|||||||
|
|
||||||
rtpSocket = bindUdpSocket(RemoteAddr.ss_family);
|
rtpSocket = bindUdpSocket(RemoteAddr.ss_family);
|
||||||
if (rtpSocket == INVALID_SOCKET) {
|
if (rtpSocket == INVALID_SOCKET) {
|
||||||
return LastSocketError();
|
return LastSocketFail();
|
||||||
}
|
}
|
||||||
|
|
||||||
err = PltCreateThread(UdpPingThreadProc, NULL, &udpPingThread);
|
err = PltCreateThread(UdpPingThreadProc, NULL, &udpPingThread);
|
||||||
|
@ -134,6 +134,7 @@ static int resolveHostName(const char *host)
|
|||||||
hints.ai_flags = AI_ADDRCONFIG;
|
hints.ai_flags = AI_ADDRCONFIG;
|
||||||
err = getaddrinfo(host, NULL, &hints, &res);
|
err = getaddrinfo(host, NULL, &hints, &res);
|
||||||
if (err != 0) {
|
if (err != 0) {
|
||||||
|
Limelog("getaddrinfo() failed: %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -201,8 +201,8 @@ static void lossStatsThreadFunc(void* context) {
|
|||||||
|
|
||||||
lossStatsPayload = malloc(payloadLengths[IDX_LOSS_STATS]);
|
lossStatsPayload = malloc(payloadLengths[IDX_LOSS_STATS]);
|
||||||
if (lossStatsPayload == NULL) {
|
if (lossStatsPayload == NULL) {
|
||||||
Limelog("Loss stats thread terminating #0\n");
|
Limelog("Loss Stats: malloc() failed\n");
|
||||||
ListenerCallbacks.connectionTerminated(LastSocketError());
|
ListenerCallbacks.connectionTerminated(-1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -221,7 +221,7 @@ static void lossStatsThreadFunc(void* context) {
|
|||||||
if (!sendMessageAndForget(packetTypes[IDX_LOSS_STATS],
|
if (!sendMessageAndForget(packetTypes[IDX_LOSS_STATS],
|
||||||
payloadLengths[IDX_LOSS_STATS], lossStatsPayload)) {
|
payloadLengths[IDX_LOSS_STATS], lossStatsPayload)) {
|
||||||
free(lossStatsPayload);
|
free(lossStatsPayload);
|
||||||
Limelog("Loss stats thread terminating #1\n");
|
Limelog("Loss Stats: Transaction failed: %d\n", (int)LastSocketError());
|
||||||
ListenerCallbacks.connectionTerminated(LastSocketError());
|
ListenerCallbacks.connectionTerminated(LastSocketError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -253,7 +253,7 @@ static void resyncThreadFunc(void* context) {
|
|||||||
|
|
||||||
// Send the resync request and read the response
|
// Send the resync request and read the response
|
||||||
if (!sendMessageAndDiscardReply(packetTypes[IDX_RESYNC], payloadLengths[IDX_RESYNC], payload)) {
|
if (!sendMessageAndDiscardReply(packetTypes[IDX_RESYNC], payloadLengths[IDX_RESYNC], payload)) {
|
||||||
Limelog("Resync thread terminating #1\n");
|
Limelog("Resync: Transaction failed: %d\n", (int)LastSocketError());
|
||||||
ListenerCallbacks.connectionTerminated(LastSocketError());
|
ListenerCallbacks.connectionTerminated(LastSocketError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -286,7 +286,7 @@ int startControlStream(void) {
|
|||||||
|
|
||||||
ctlSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 47995);
|
ctlSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 47995);
|
||||||
if (ctlSock == INVALID_SOCKET) {
|
if (ctlSock == INVALID_SOCKET) {
|
||||||
return LastSocketError();
|
return LastSocketFail();
|
||||||
}
|
}
|
||||||
|
|
||||||
enableNoDelay(ctlSock);
|
enableNoDelay(ctlSock);
|
||||||
@ -295,14 +295,16 @@ int startControlStream(void) {
|
|||||||
if (!sendMessageAndDiscardReply(packetTypes[IDX_START_A],
|
if (!sendMessageAndDiscardReply(packetTypes[IDX_START_A],
|
||||||
payloadLengths[IDX_START_A],
|
payloadLengths[IDX_START_A],
|
||||||
preconstructedPayloads[IDX_START_A])) {
|
preconstructedPayloads[IDX_START_A])) {
|
||||||
return LastSocketError();
|
Limelog("Start A failed: %d\n", (int)LastSocketError());
|
||||||
|
return LastSocketFail();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send START B
|
// Send START B
|
||||||
if (!sendMessageAndDiscardReply(packetTypes[IDX_START_B],
|
if (!sendMessageAndDiscardReply(packetTypes[IDX_START_B],
|
||||||
payloadLengths[IDX_START_B],
|
payloadLengths[IDX_START_B],
|
||||||
preconstructedPayloads[IDX_START_B])) {
|
preconstructedPayloads[IDX_START_B])) {
|
||||||
return LastSocketError();
|
Limelog("Start B failed: %d\n", (int)LastSocketError());
|
||||||
|
return LastSocketFail();
|
||||||
}
|
}
|
||||||
|
|
||||||
err = PltCreateThread(lossStatsThreadFunc, NULL, &lossStatsThread);
|
err = PltCreateThread(lossStatsThreadFunc, NULL, &lossStatsThread);
|
||||||
|
@ -132,8 +132,6 @@ static void inputSendThreadProc(void* context) {
|
|||||||
|
|
||||||
err = LbqWaitForQueueElement(&packetQueue, (void**) &holder);
|
err = LbqWaitForQueueElement(&packetQueue, (void**) &holder);
|
||||||
if (err != LBQ_SUCCESS) {
|
if (err != LBQ_SUCCESS) {
|
||||||
Limelog("Input thread terminating #1\n");
|
|
||||||
ListenerCallbacks.connectionTerminated(err);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -244,7 +242,7 @@ static void inputSendThreadProc(void* context) {
|
|||||||
(unsigned char*) encryptedBuffer, &encryptedSize);
|
(unsigned char*) encryptedBuffer, &encryptedSize);
|
||||||
free(holder);
|
free(holder);
|
||||||
if (err != OAES_RET_SUCCESS) {
|
if (err != OAES_RET_SUCCESS) {
|
||||||
Limelog("Input thread terminating #2\n");
|
Limelog("Input: Encryption failed: %d\n", (int)err);
|
||||||
ListenerCallbacks.connectionTerminated(err);
|
ListenerCallbacks.connectionTerminated(err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -263,8 +261,8 @@ static void inputSendThreadProc(void* context) {
|
|||||||
err = send(inputSock, (const char*) &encryptedBuffer[OAES_DATA_OFFSET - sizeof(encryptedLengthPrefix)],
|
err = send(inputSock, (const char*) &encryptedBuffer[OAES_DATA_OFFSET - sizeof(encryptedLengthPrefix)],
|
||||||
encryptedSize + sizeof(encryptedLengthPrefix), 0);
|
encryptedSize + sizeof(encryptedLengthPrefix), 0);
|
||||||
if (err <= 0) {
|
if (err <= 0) {
|
||||||
Limelog("Input thread terminating #3\n");
|
Limelog("Input: send() failed: %d\n", (int)LastSocketError());
|
||||||
ListenerCallbacks.connectionTerminated(err);
|
ListenerCallbacks.connectionTerminated(LastSocketError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -276,7 +274,7 @@ int startInputStream(void) {
|
|||||||
|
|
||||||
inputSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 35043);
|
inputSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 35043);
|
||||||
if (inputSock == INVALID_SOCKET) {
|
if (inputSock == INVALID_SOCKET) {
|
||||||
return LastSocketError();
|
return LastSocketFail();
|
||||||
}
|
}
|
||||||
|
|
||||||
enableNoDelay(inputSock);
|
enableNoDelay(inputSock);
|
||||||
|
@ -30,6 +30,7 @@ SOCKET bindUdpSocket(int addrfamily) {
|
|||||||
|
|
||||||
s = socket(addrfamily, SOCK_DGRAM, IPPROTO_UDP);
|
s = socket(addrfamily, SOCK_DGRAM, IPPROTO_UDP);
|
||||||
if (s == INVALID_SOCKET) {
|
if (s == INVALID_SOCKET) {
|
||||||
|
Limelog("socket() failed: %d\n", (int)LastSocketError());
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,6 +41,7 @@ SOCKET bindUdpSocket(int addrfamily) {
|
|||||||
sizeof(struct sockaddr_in) :
|
sizeof(struct sockaddr_in) :
|
||||||
sizeof(struct sockaddr_in6)) == SOCKET_ERROR) {
|
sizeof(struct sockaddr_in6)) == SOCKET_ERROR) {
|
||||||
err = LastSocketError();
|
err = LastSocketError();
|
||||||
|
Limelog("bind() failed: %d\n", err);
|
||||||
closesocket(s);
|
closesocket(s);
|
||||||
SetLastSocketError(err);
|
SetLastSocketError(err);
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
@ -68,6 +70,7 @@ SOCKET connectTcpSocket(struct sockaddr_storage *dstaddr, SOCKADDR_LEN addrlen,
|
|||||||
|
|
||||||
s = socket(dstaddr->ss_family, SOCK_STREAM, IPPROTO_TCP);
|
s = socket(dstaddr->ss_family, SOCK_STREAM, IPPROTO_TCP);
|
||||||
if (s == INVALID_SOCKET) {
|
if (s == INVALID_SOCKET) {
|
||||||
|
Limelog("socket() failed: %d\n", (int)LastSocketError());
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,6 +84,7 @@ SOCKET connectTcpSocket(struct sockaddr_storage *dstaddr, SOCKADDR_LEN addrlen,
|
|||||||
addr.sin6_port = htons(port);
|
addr.sin6_port = htons(port);
|
||||||
if (connect(s, (struct sockaddr*) &addr, addrlen) == SOCKET_ERROR) {
|
if (connect(s, (struct sockaddr*) &addr, addrlen) == SOCKET_ERROR) {
|
||||||
err = LastSocketError();
|
err = LastSocketError();
|
||||||
|
Limelog("connect() failed: %d\n", err);
|
||||||
closesocket(s);
|
closesocket(s);
|
||||||
SetLastSocketError(err);
|
SetLastSocketError(err);
|
||||||
return INVALID_SOCKET;
|
return INVALID_SOCKET;
|
||||||
|
@ -33,6 +33,8 @@ typedef ssize_t SOCK_RET;
|
|||||||
typedef socklen_t SOCKADDR_LEN;
|
typedef socklen_t SOCKADDR_LEN;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define LastSocketFail() ((LastSocketError() != 0) ? LastSocketError() : -1)
|
||||||
|
|
||||||
// IPv6 addresses have 2 extra characters for URL escaping
|
// IPv6 addresses have 2 extra characters for URL escaping
|
||||||
#define URLSAFESTRING_LEN INET6_ADDRSTRLEN+2
|
#define URLSAFESTRING_LEN INET6_ADDRSTRLEN+2
|
||||||
void addrToUrlSafeString(struct sockaddr_storage *addr, char* string);
|
void addrToUrlSafeString(struct sockaddr_storage *addr, char* string);
|
||||||
|
@ -78,15 +78,18 @@ static int initializeRtspRequest(PRTSP_MESSAGE msg, char* command, char* target)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send RTSP message and get response */
|
/* Send RTSP message and get response */
|
||||||
static int transactRtspMessage(PRTSP_MESSAGE request, PRTSP_MESSAGE response) {
|
static int transactRtspMessage(PRTSP_MESSAGE request, PRTSP_MESSAGE response, int* error) {
|
||||||
SOCK_RET err;
|
SOCK_RET err;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
int offset;
|
int offset;
|
||||||
char* serializedMessage = NULL;
|
char* serializedMessage = NULL;
|
||||||
int messageLen;
|
int messageLen;
|
||||||
|
|
||||||
|
*error = -1;
|
||||||
|
|
||||||
sock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 48010);
|
sock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 48010);
|
||||||
if (sock == INVALID_SOCKET) {
|
if (sock == INVALID_SOCKET) {
|
||||||
|
*error = LastSocketError();
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
enableNoDelay(sock);
|
enableNoDelay(sock);
|
||||||
@ -94,12 +97,15 @@ static int transactRtspMessage(PRTSP_MESSAGE request, PRTSP_MESSAGE response) {
|
|||||||
serializedMessage = serializeRtspMessage(request, &messageLen);
|
serializedMessage = serializeRtspMessage(request, &messageLen);
|
||||||
if (serializedMessage == NULL) {
|
if (serializedMessage == NULL) {
|
||||||
closesocket(sock);
|
closesocket(sock);
|
||||||
|
sock = INVALID_SOCKET;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Send our message
|
// Send our message
|
||||||
err = send(sock, serializedMessage, messageLen, 0);
|
err = send(sock, serializedMessage, messageLen, 0);
|
||||||
if (err == SOCKET_ERROR) {
|
if (err == SOCKET_ERROR) {
|
||||||
|
*error = LastSocketError();
|
||||||
|
Limelog("Failed to send RTSP message: %d\n", *error);
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,13 +153,15 @@ void terminateRtspHandshake(void) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send RTSP OPTIONS request */
|
/* Send RTSP OPTIONS request */
|
||||||
static int requestOptions(PRTSP_MESSAGE response) {
|
static int requestOptions(PRTSP_MESSAGE response, int* error) {
|
||||||
RTSP_MESSAGE request;
|
RTSP_MESSAGE request;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
*error = -1;
|
||||||
|
|
||||||
ret = initializeRtspRequest(&request, "OPTIONS", rtspTargetUrl);
|
ret = initializeRtspRequest(&request, "OPTIONS", rtspTargetUrl);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
ret = transactRtspMessage(&request, response);
|
ret = transactRtspMessage(&request, response, error);
|
||||||
freeMessage(&request);
|
freeMessage(&request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -161,9 +169,11 @@ static int requestOptions(PRTSP_MESSAGE response) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send RTSP DESCRIBE request */
|
/* Send RTSP DESCRIBE request */
|
||||||
static int requestDescribe(PRTSP_MESSAGE response) {
|
static int requestDescribe(PRTSP_MESSAGE response, int* error) {
|
||||||
RTSP_MESSAGE request;
|
RTSP_MESSAGE request;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
*error = -1;
|
||||||
|
|
||||||
ret = initializeRtspRequest(&request, "DESCRIBE", rtspTargetUrl);
|
ret = initializeRtspRequest(&request, "DESCRIBE", rtspTargetUrl);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
@ -171,7 +181,7 @@ static int requestDescribe(PRTSP_MESSAGE response) {
|
|||||||
"application/sdp") &&
|
"application/sdp") &&
|
||||||
addOption(&request, "If-Modified-Since",
|
addOption(&request, "If-Modified-Since",
|
||||||
"Thu, 01 Jan 1970 00:00:00 GMT")) {
|
"Thu, 01 Jan 1970 00:00:00 GMT")) {
|
||||||
ret = transactRtspMessage(&request, response);
|
ret = transactRtspMessage(&request, response, error);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -183,9 +193,11 @@ static int requestDescribe(PRTSP_MESSAGE response) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send RTSP SETUP request */
|
/* Send RTSP SETUP request */
|
||||||
static int setupStream(PRTSP_MESSAGE response, char* target) {
|
static int setupStream(PRTSP_MESSAGE response, char* target, int* error) {
|
||||||
RTSP_MESSAGE request;
|
RTSP_MESSAGE request;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
*error = -1;
|
||||||
|
|
||||||
ret = initializeRtspRequest(&request, "SETUP", target);
|
ret = initializeRtspRequest(&request, "SETUP", target);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
@ -199,7 +211,7 @@ static int setupStream(PRTSP_MESSAGE response, char* target) {
|
|||||||
if (addOption(&request, "Transport", " ") &&
|
if (addOption(&request, "Transport", " ") &&
|
||||||
addOption(&request, "If-Modified-Since",
|
addOption(&request, "If-Modified-Since",
|
||||||
"Thu, 01 Jan 1970 00:00:00 GMT")) {
|
"Thu, 01 Jan 1970 00:00:00 GMT")) {
|
||||||
ret = transactRtspMessage(&request, response);
|
ret = transactRtspMessage(&request, response, error);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -213,14 +225,16 @@ static int setupStream(PRTSP_MESSAGE response, char* target) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send RTSP PLAY request*/
|
/* Send RTSP PLAY request*/
|
||||||
static int playStream(PRTSP_MESSAGE response, char* target) {
|
static int playStream(PRTSP_MESSAGE response, char* target, int* error) {
|
||||||
RTSP_MESSAGE request;
|
RTSP_MESSAGE request;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
*error = -1;
|
||||||
|
|
||||||
ret = initializeRtspRequest(&request, "PLAY", target);
|
ret = initializeRtspRequest(&request, "PLAY", target);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
if (addOption(&request, "Session", sessionIdString)) {
|
if (addOption(&request, "Session", sessionIdString)) {
|
||||||
ret = transactRtspMessage(&request, response);
|
ret = transactRtspMessage(&request, response, error);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -232,11 +246,13 @@ static int playStream(PRTSP_MESSAGE response, char* target) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Send RTSP ANNOUNCE message */
|
/* Send RTSP ANNOUNCE message */
|
||||||
static int sendVideoAnnounce(PRTSP_MESSAGE response, PSTREAM_CONFIGURATION streamConfig) {
|
static int sendVideoAnnounce(PRTSP_MESSAGE response, int* error) {
|
||||||
RTSP_MESSAGE request;
|
RTSP_MESSAGE request;
|
||||||
int ret;
|
int ret;
|
||||||
int payloadLength;
|
int payloadLength;
|
||||||
char payloadLengthStr[16];
|
char payloadLengthStr[16];
|
||||||
|
|
||||||
|
*error = -1;
|
||||||
|
|
||||||
ret = initializeRtspRequest(&request, "ANNOUNCE", "streamid=video");
|
ret = initializeRtspRequest(&request, "ANNOUNCE", "streamid=video");
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
@ -259,7 +275,7 @@ static int sendVideoAnnounce(PRTSP_MESSAGE response, PSTREAM_CONFIGURATION strea
|
|||||||
goto FreeMessage;
|
goto FreeMessage;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = transactRtspMessage(&request, response);
|
ret = transactRtspMessage(&request, response, error);
|
||||||
|
|
||||||
FreeMessage:
|
FreeMessage:
|
||||||
freeMessage(&request);
|
freeMessage(&request);
|
||||||
@ -287,16 +303,17 @@ int performRtspHandshake(void) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
RTSP_MESSAGE response;
|
RTSP_MESSAGE response;
|
||||||
|
int error = -1;
|
||||||
|
|
||||||
if (!requestOptions(&response)) {
|
if (!requestOptions(&response, &error)) {
|
||||||
Limelog("RTSP OPTIONS request failed\n");
|
Limelog("RTSP OPTIONS request failed: %d\n", error);
|
||||||
return -1;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.message.response.statusCode != 200) {
|
if (response.message.response.statusCode != 200) {
|
||||||
Limelog("RTSP OPTIONS request failed: %d\n",
|
Limelog("RTSP OPTIONS request failed: %d\n",
|
||||||
response.message.response.statusCode);
|
response.message.response.statusCode);
|
||||||
return -1;
|
return response.message.response.statusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
freeMessage(&response);
|
freeMessage(&response);
|
||||||
@ -304,16 +321,17 @@ int performRtspHandshake(void) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
RTSP_MESSAGE response;
|
RTSP_MESSAGE response;
|
||||||
|
int error = -1;
|
||||||
|
|
||||||
if (!requestDescribe(&response)) {
|
if (!requestDescribe(&response, &error)) {
|
||||||
Limelog("RTSP DESCRIBE request failed\n");
|
Limelog("RTSP DESCRIBE request failed: %d\n", error);
|
||||||
return -1;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.message.response.statusCode != 200) {
|
if (response.message.response.statusCode != 200) {
|
||||||
Limelog("RTSP DESCRIBE request failed: %d\n",
|
Limelog("RTSP DESCRIBE request failed: %d\n",
|
||||||
response.message.response.statusCode);
|
response.message.response.statusCode);
|
||||||
return -1;
|
return response.message.response.statusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
freeMessage(&response);
|
freeMessage(&response);
|
||||||
@ -322,16 +340,17 @@ int performRtspHandshake(void) {
|
|||||||
{
|
{
|
||||||
RTSP_MESSAGE response;
|
RTSP_MESSAGE response;
|
||||||
char* sessionId;
|
char* sessionId;
|
||||||
|
int error = -1;
|
||||||
|
|
||||||
if (!setupStream(&response, "streamid=audio")) {
|
if (!setupStream(&response, "streamid=audio", &error)) {
|
||||||
Limelog("RTSP SETUP streamid=audio request failed\n");
|
Limelog("RTSP SETUP streamid=audio request failed: %d\n", error);
|
||||||
return -1;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.message.response.statusCode != 200) {
|
if (response.message.response.statusCode != 200) {
|
||||||
Limelog("RTSP SETUP streamid=audio request failed: %d\n",
|
Limelog("RTSP SETUP streamid=audio request failed: %d\n",
|
||||||
response.message.response.statusCode);
|
response.message.response.statusCode);
|
||||||
return -1;
|
return response.message.response.statusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
sessionId = getOptionContent(response.options, "Session");
|
sessionId = getOptionContent(response.options, "Session");
|
||||||
@ -348,16 +367,17 @@ int performRtspHandshake(void) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
RTSP_MESSAGE response;
|
RTSP_MESSAGE response;
|
||||||
|
int error = -1;
|
||||||
|
|
||||||
if (!setupStream(&response, "streamid=video")) {
|
if (!setupStream(&response, "streamid=video", &error)) {
|
||||||
Limelog("RTSP SETUP streamid=video request failed\n");
|
Limelog("RTSP SETUP streamid=video request failed: %d\n", error);
|
||||||
return -1;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.message.response.statusCode != 200) {
|
if (response.message.response.statusCode != 200) {
|
||||||
Limelog("RTSP SETUP streamid=video request failed: %d\n",
|
Limelog("RTSP SETUP streamid=video request failed: %d\n",
|
||||||
response.message.response.statusCode);
|
response.message.response.statusCode);
|
||||||
return -1;
|
return response.message.response.statusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
freeMessage(&response);
|
freeMessage(&response);
|
||||||
@ -365,16 +385,17 @@ int performRtspHandshake(void) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
RTSP_MESSAGE response;
|
RTSP_MESSAGE response;
|
||||||
|
int error = -1;
|
||||||
|
|
||||||
if (!sendVideoAnnounce(&response, &StreamConfig)) {
|
if (!sendVideoAnnounce(&response, &error)) {
|
||||||
Limelog("RTSP ANNOUNCE request failed\n");
|
Limelog("RTSP ANNOUNCE request failed: %d\n", error);
|
||||||
return -1;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.message.response.statusCode != 200) {
|
if (response.message.response.statusCode != 200) {
|
||||||
Limelog("RTSP ANNOUNCE request failed: %d\n",
|
Limelog("RTSP ANNOUNCE request failed: %d\n",
|
||||||
response.message.response.statusCode);
|
response.message.response.statusCode);
|
||||||
return -1;
|
return response.message.response.statusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
freeMessage(&response);
|
freeMessage(&response);
|
||||||
@ -382,16 +403,17 @@ int performRtspHandshake(void) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
RTSP_MESSAGE response;
|
RTSP_MESSAGE response;
|
||||||
|
int error = -1;
|
||||||
|
|
||||||
if (!playStream(&response, "streamid=video")) {
|
if (!playStream(&response, "streamid=video", &error)) {
|
||||||
Limelog("RTSP PLAY streamid=video request failed\n");
|
Limelog("RTSP PLAY streamid=video request failed: %d\n", error);
|
||||||
return -1;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.message.response.statusCode != 200) {
|
if (response.message.response.statusCode != 200) {
|
||||||
Limelog("RTSP PLAY streamid=video failed: %d\n",
|
Limelog("RTSP PLAY streamid=video failed: %d\n",
|
||||||
response.message.response.statusCode);
|
response.message.response.statusCode);
|
||||||
return -1;
|
return response.message.response.statusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
freeMessage(&response);
|
freeMessage(&response);
|
||||||
@ -399,16 +421,17 @@ int performRtspHandshake(void) {
|
|||||||
|
|
||||||
{
|
{
|
||||||
RTSP_MESSAGE response;
|
RTSP_MESSAGE response;
|
||||||
|
int error = -1;
|
||||||
|
|
||||||
if (!playStream(&response, "streamid=audio")) {
|
if (!playStream(&response, "streamid=audio", &error)) {
|
||||||
Limelog("RTSP PLAY streamid=audio request failed\n");
|
Limelog("RTSP PLAY streamid=audio request failed: %d\n", error);
|
||||||
return -1;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (response.message.response.statusCode != 200) {
|
if (response.message.response.statusCode != 200) {
|
||||||
Limelog("RTSP PLAY streamid=audio failed: %d\n",
|
Limelog("RTSP PLAY streamid=audio failed: %d\n",
|
||||||
response.message.response.statusCode);
|
response.message.response.statusCode);
|
||||||
return -1;
|
return response.message.response.statusCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
freeMessage(&response);
|
freeMessage(&response);
|
||||||
|
@ -185,7 +185,7 @@ static void reassembleAvcFrame(int frameNumber) {
|
|||||||
nalChainDataLength = 0;
|
nalChainDataLength = 0;
|
||||||
|
|
||||||
if (LbqOfferQueueItem(&decodeUnitQueue, qdu, &qdu->entry) == LBQ_BOUND_EXCEEDED) {
|
if (LbqOfferQueueItem(&decodeUnitQueue, qdu, &qdu->entry) == LBQ_BOUND_EXCEEDED) {
|
||||||
Limelog("Decode unit queue overflow\n");
|
Limelog("Video decode unit queue overflow\n");
|
||||||
|
|
||||||
// Clear frame state and wait for an IDR
|
// Clear frame state and wait for an IDR
|
||||||
nalChainHead = qdu->decodeUnit.bufferList;
|
nalChainHead = qdu->decodeUnit.bufferList;
|
||||||
|
@ -49,7 +49,7 @@ static void UdpPingThreadProc(void *context) {
|
|||||||
while (!PltIsThreadInterrupted(&udpPingThread)) {
|
while (!PltIsThreadInterrupted(&udpPingThread)) {
|
||||||
err = sendto(rtpSocket, pingData, sizeof(pingData), 0, (struct sockaddr*)&saddr, RemoteAddrLen);
|
err = sendto(rtpSocket, pingData, sizeof(pingData), 0, (struct sockaddr*)&saddr, RemoteAddrLen);
|
||||||
if (err != sizeof(pingData)) {
|
if (err != sizeof(pingData)) {
|
||||||
Limelog("UDP ping thread terminating #1\n");
|
Limelog("Video Ping: send() failed: %d\n", (int)LastSocketError());
|
||||||
ListenerCallbacks.connectionTerminated(LastSocketError());
|
ListenerCallbacks.connectionTerminated(LastSocketError());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -75,7 +75,7 @@ static void ReceiveThreadProc(void* context) {
|
|||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
buffer = (char*) malloc(bufferSize);
|
buffer = (char*) malloc(bufferSize);
|
||||||
if (buffer == NULL) {
|
if (buffer == NULL) {
|
||||||
Limelog("Receive thread terminating\n");
|
Limelog("Video Receive: malloc() failed\n");
|
||||||
ListenerCallbacks.connectionTerminated(-1);
|
ListenerCallbacks.connectionTerminated(-1);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -83,7 +83,7 @@ static void ReceiveThreadProc(void* context) {
|
|||||||
|
|
||||||
err = (int) recv(rtpSocket, buffer, receiveSize, 0);
|
err = (int) recv(rtpSocket, buffer, receiveSize, 0);
|
||||||
if (err <= 0) {
|
if (err <= 0) {
|
||||||
Limelog("Receive thread terminating #2\n");
|
Limelog("Video Receive: recv() failed: %d\n", (int)LastSocketError());
|
||||||
ListenerCallbacks.connectionTerminated(LastSocketError());
|
ListenerCallbacks.connectionTerminated(LastSocketError());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -123,7 +123,6 @@ static void DecoderThreadProc(void* context) {
|
|||||||
PQUEUED_DECODE_UNIT qdu;
|
PQUEUED_DECODE_UNIT qdu;
|
||||||
while (!PltIsThreadInterrupted(&decoderThread)) {
|
while (!PltIsThreadInterrupted(&decoderThread)) {
|
||||||
if (!getNextQueuedDecodeUnit(&qdu)) {
|
if (!getNextQueuedDecodeUnit(&qdu)) {
|
||||||
Limelog("Decoder thread terminating\n");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user