From a5f59d206e6ad93ae3bbf2a5672ee319d19cb455 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Wed, 24 Jun 2015 22:52:26 -0700 Subject: [PATCH] Improve debugging and error codes --- limelight-common/AudioStream.c | 11 ++- limelight-common/Connection.c | 1 + limelight-common/ControlStream.c | 16 +++-- limelight-common/InputStream.c | 10 ++- limelight-common/PlatformSockets.c | 4 ++ limelight-common/PlatformSockets.h | 2 + limelight-common/RtspConnection.c | 101 ++++++++++++++++----------- limelight-common/VideoDepacketizer.c | 2 +- limelight-common/VideoStream.c | 7 +- 9 files changed, 91 insertions(+), 63 deletions(-) diff --git a/limelight-common/AudioStream.c b/limelight-common/AudioStream.c index b5745ff..4aca21b 100644 --- a/limelight-common/AudioStream.c +++ b/limelight-common/AudioStream.c @@ -68,7 +68,7 @@ static void UdpPingThreadProc(void *context) { while (!PltIsThreadInterrupted(&udpPingThread)) { err = sendto(rtpSocket, pingData, sizeof(pingData), 0, (struct sockaddr*)&saddr, RemoteAddrLen); if (err != sizeof(pingData)) { - Limelog("UDP ping thread terminating #1\n"); + Limelog("Audio Ping: sendto() failed: %d\n", (int)LastSocketError()); ListenerCallbacks.connectionTerminated(LastSocketError()); return; } @@ -90,7 +90,6 @@ static int queuePacketToLbq(PQUEUED_AUDIO_PACKET *packet) { freePacketList(LbqFlushQueueItems(&packetQueue)); } else if (err == LBQ_INTERRUPTED) { - Limelog("Receive thread terminating #3\n"); free(*packet); return 0; } @@ -109,7 +108,7 @@ static void ReceiveThreadProc(void* context) { if (packet == NULL) { packet = (PQUEUED_AUDIO_PACKET) malloc(sizeof(*packet)); if (packet == NULL) { - Limelog("Receive thread terminating\n"); + Limelog("Audio Receive: malloc() failed\n"); ListenerCallbacks.connectionTerminated(-1); return; } @@ -117,7 +116,7 @@ static void ReceiveThreadProc(void* context) { packet->size = (int) recv(rtpSocket, &packet->data[0], MAX_PACKET_SIZE, 0); if (packet->size <= 0) { - Limelog("Receive thread terminating #2\n"); + Limelog("Audio Receive: recv() failed: %d\n", (int)LastSocketError()); free(packet); ListenerCallbacks.connectionTerminated(LastSocketError()); return; @@ -172,7 +171,7 @@ static void DecoderThreadProc(void* context) { while (!PltIsThreadInterrupted(&decoderThread)) { err = LbqWaitForQueueElement(&packetQueue, (void**) &packet); if (err != LBQ_SUCCESS) { - Limelog("Decoder thread terminating\n"); + // An exit signal was received return; } @@ -217,7 +216,7 @@ int startAudioStream(void) { rtpSocket = bindUdpSocket(RemoteAddr.ss_family); if (rtpSocket == INVALID_SOCKET) { - return LastSocketError(); + return LastSocketFail(); } err = PltCreateThread(UdpPingThreadProc, NULL, &udpPingThread); diff --git a/limelight-common/Connection.c b/limelight-common/Connection.c index 0dee3c8..930d113 100644 --- a/limelight-common/Connection.c +++ b/limelight-common/Connection.c @@ -134,6 +134,7 @@ static int resolveHostName(const char *host) hints.ai_flags = AI_ADDRCONFIG; err = getaddrinfo(host, NULL, &hints, &res); if (err != 0) { + Limelog("getaddrinfo() failed: %d\n", err); return err; } diff --git a/limelight-common/ControlStream.c b/limelight-common/ControlStream.c index 963cc27..3a95249 100644 --- a/limelight-common/ControlStream.c +++ b/limelight-common/ControlStream.c @@ -201,8 +201,8 @@ static void lossStatsThreadFunc(void* context) { lossStatsPayload = malloc(payloadLengths[IDX_LOSS_STATS]); if (lossStatsPayload == NULL) { - Limelog("Loss stats thread terminating #0\n"); - ListenerCallbacks.connectionTerminated(LastSocketError()); + Limelog("Loss Stats: malloc() failed\n"); + ListenerCallbacks.connectionTerminated(-1); return; } @@ -221,7 +221,7 @@ static void lossStatsThreadFunc(void* context) { if (!sendMessageAndForget(packetTypes[IDX_LOSS_STATS], payloadLengths[IDX_LOSS_STATS], lossStatsPayload)) { free(lossStatsPayload); - Limelog("Loss stats thread terminating #1\n"); + Limelog("Loss Stats: Transaction failed: %d\n", (int)LastSocketError()); ListenerCallbacks.connectionTerminated(LastSocketError()); return; } @@ -253,7 +253,7 @@ static void resyncThreadFunc(void* context) { // Send the resync request and read the response 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()); return; } @@ -286,7 +286,7 @@ int startControlStream(void) { ctlSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 47995); if (ctlSock == INVALID_SOCKET) { - return LastSocketError(); + return LastSocketFail(); } enableNoDelay(ctlSock); @@ -295,14 +295,16 @@ int startControlStream(void) { if (!sendMessageAndDiscardReply(packetTypes[IDX_START_A], payloadLengths[IDX_START_A], preconstructedPayloads[IDX_START_A])) { - return LastSocketError(); + Limelog("Start A failed: %d\n", (int)LastSocketError()); + return LastSocketFail(); } // Send START B if (!sendMessageAndDiscardReply(packetTypes[IDX_START_B], payloadLengths[IDX_START_B], preconstructedPayloads[IDX_START_B])) { - return LastSocketError(); + Limelog("Start B failed: %d\n", (int)LastSocketError()); + return LastSocketFail(); } err = PltCreateThread(lossStatsThreadFunc, NULL, &lossStatsThread); diff --git a/limelight-common/InputStream.c b/limelight-common/InputStream.c index 2face30..7c14ea1 100644 --- a/limelight-common/InputStream.c +++ b/limelight-common/InputStream.c @@ -132,8 +132,6 @@ static void inputSendThreadProc(void* context) { err = LbqWaitForQueueElement(&packetQueue, (void**) &holder); if (err != LBQ_SUCCESS) { - Limelog("Input thread terminating #1\n"); - ListenerCallbacks.connectionTerminated(err); return; } @@ -244,7 +242,7 @@ static void inputSendThreadProc(void* context) { (unsigned char*) encryptedBuffer, &encryptedSize); free(holder); if (err != OAES_RET_SUCCESS) { - Limelog("Input thread terminating #2\n"); + Limelog("Input: Encryption failed: %d\n", (int)err); ListenerCallbacks.connectionTerminated(err); return; } @@ -263,8 +261,8 @@ static void inputSendThreadProc(void* context) { err = send(inputSock, (const char*) &encryptedBuffer[OAES_DATA_OFFSET - sizeof(encryptedLengthPrefix)], encryptedSize + sizeof(encryptedLengthPrefix), 0); if (err <= 0) { - Limelog("Input thread terminating #3\n"); - ListenerCallbacks.connectionTerminated(err); + Limelog("Input: send() failed: %d\n", (int)LastSocketError()); + ListenerCallbacks.connectionTerminated(LastSocketError()); return; } } @@ -276,7 +274,7 @@ int startInputStream(void) { inputSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 35043); if (inputSock == INVALID_SOCKET) { - return LastSocketError(); + return LastSocketFail(); } enableNoDelay(inputSock); diff --git a/limelight-common/PlatformSockets.c b/limelight-common/PlatformSockets.c index 2de3c86..6f975ba 100644 --- a/limelight-common/PlatformSockets.c +++ b/limelight-common/PlatformSockets.c @@ -30,6 +30,7 @@ SOCKET bindUdpSocket(int addrfamily) { s = socket(addrfamily, SOCK_DGRAM, IPPROTO_UDP); if (s == INVALID_SOCKET) { + Limelog("socket() failed: %d\n", (int)LastSocketError()); return INVALID_SOCKET; } @@ -40,6 +41,7 @@ SOCKET bindUdpSocket(int addrfamily) { sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)) == SOCKET_ERROR) { err = LastSocketError(); + Limelog("bind() failed: %d\n", err); closesocket(s); SetLastSocketError(err); 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); if (s == INVALID_SOCKET) { + Limelog("socket() failed: %d\n", (int)LastSocketError()); return INVALID_SOCKET; } @@ -81,6 +84,7 @@ SOCKET connectTcpSocket(struct sockaddr_storage *dstaddr, SOCKADDR_LEN addrlen, addr.sin6_port = htons(port); if (connect(s, (struct sockaddr*) &addr, addrlen) == SOCKET_ERROR) { err = LastSocketError(); + Limelog("connect() failed: %d\n", err); closesocket(s); SetLastSocketError(err); return INVALID_SOCKET; diff --git a/limelight-common/PlatformSockets.h b/limelight-common/PlatformSockets.h index 00501c1..827033e 100644 --- a/limelight-common/PlatformSockets.h +++ b/limelight-common/PlatformSockets.h @@ -33,6 +33,8 @@ typedef ssize_t SOCK_RET; typedef socklen_t SOCKADDR_LEN; #endif +#define LastSocketFail() ((LastSocketError() != 0) ? LastSocketError() : -1) + // IPv6 addresses have 2 extra characters for URL escaping #define URLSAFESTRING_LEN INET6_ADDRSTRLEN+2 void addrToUrlSafeString(struct sockaddr_storage *addr, char* string); diff --git a/limelight-common/RtspConnection.c b/limelight-common/RtspConnection.c index 81e0651..36e4860 100644 --- a/limelight-common/RtspConnection.c +++ b/limelight-common/RtspConnection.c @@ -78,15 +78,18 @@ static int initializeRtspRequest(PRTSP_MESSAGE msg, char* command, char* target) } /* 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; int ret = 0; int offset; char* serializedMessage = NULL; int messageLen; + + *error = -1; sock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 48010); if (sock == INVALID_SOCKET) { + *error = LastSocketError(); return ret; } enableNoDelay(sock); @@ -94,12 +97,15 @@ static int transactRtspMessage(PRTSP_MESSAGE request, PRTSP_MESSAGE response) { serializedMessage = serializeRtspMessage(request, &messageLen); if (serializedMessage == NULL) { closesocket(sock); + sock = INVALID_SOCKET; return ret; } // Send our message err = send(sock, serializedMessage, messageLen, 0); if (err == SOCKET_ERROR) { + *error = LastSocketError(); + Limelog("Failed to send RTSP message: %d\n", *error); goto Exit; } @@ -147,13 +153,15 @@ void terminateRtspHandshake(void) { } /* Send RTSP OPTIONS request */ -static int requestOptions(PRTSP_MESSAGE response) { +static int requestOptions(PRTSP_MESSAGE response, int* error) { RTSP_MESSAGE request; int ret; + + *error = -1; ret = initializeRtspRequest(&request, "OPTIONS", rtspTargetUrl); if (ret != 0) { - ret = transactRtspMessage(&request, response); + ret = transactRtspMessage(&request, response, error); freeMessage(&request); } @@ -161,9 +169,11 @@ static int requestOptions(PRTSP_MESSAGE response) { } /* Send RTSP DESCRIBE request */ -static int requestDescribe(PRTSP_MESSAGE response) { +static int requestDescribe(PRTSP_MESSAGE response, int* error) { RTSP_MESSAGE request; int ret; + + *error = -1; ret = initializeRtspRequest(&request, "DESCRIBE", rtspTargetUrl); if (ret != 0) { @@ -171,7 +181,7 @@ static int requestDescribe(PRTSP_MESSAGE response) { "application/sdp") && addOption(&request, "If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT")) { - ret = transactRtspMessage(&request, response); + ret = transactRtspMessage(&request, response, error); } else { ret = 0; @@ -183,9 +193,11 @@ static int requestDescribe(PRTSP_MESSAGE response) { } /* 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; int ret; + + *error = -1; ret = initializeRtspRequest(&request, "SETUP", target); if (ret != 0) { @@ -199,7 +211,7 @@ static int setupStream(PRTSP_MESSAGE response, char* target) { if (addOption(&request, "Transport", " ") && addOption(&request, "If-Modified-Since", "Thu, 01 Jan 1970 00:00:00 GMT")) { - ret = transactRtspMessage(&request, response); + ret = transactRtspMessage(&request, response, error); } else { ret = 0; @@ -213,14 +225,16 @@ static int setupStream(PRTSP_MESSAGE response, char* target) { } /* 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; int ret; + + *error = -1; ret = initializeRtspRequest(&request, "PLAY", target); if (ret != 0) { if (addOption(&request, "Session", sessionIdString)) { - ret = transactRtspMessage(&request, response); + ret = transactRtspMessage(&request, response, error); } else { ret = 0; @@ -232,11 +246,13 @@ static int playStream(PRTSP_MESSAGE response, char* target) { } /* Send RTSP ANNOUNCE message */ -static int sendVideoAnnounce(PRTSP_MESSAGE response, PSTREAM_CONFIGURATION streamConfig) { +static int sendVideoAnnounce(PRTSP_MESSAGE response, int* error) { RTSP_MESSAGE request; int ret; int payloadLength; char payloadLengthStr[16]; + + *error = -1; ret = initializeRtspRequest(&request, "ANNOUNCE", "streamid=video"); if (ret != 0) { @@ -259,7 +275,7 @@ static int sendVideoAnnounce(PRTSP_MESSAGE response, PSTREAM_CONFIGURATION strea goto FreeMessage; } - ret = transactRtspMessage(&request, response); + ret = transactRtspMessage(&request, response, error); FreeMessage: freeMessage(&request); @@ -287,16 +303,17 @@ int performRtspHandshake(void) { { RTSP_MESSAGE response; + int error = -1; - if (!requestOptions(&response)) { - Limelog("RTSP OPTIONS request failed\n"); - return -1; + if (!requestOptions(&response, &error)) { + Limelog("RTSP OPTIONS request failed: %d\n", error); + return error; } if (response.message.response.statusCode != 200) { Limelog("RTSP OPTIONS request failed: %d\n", response.message.response.statusCode); - return -1; + return response.message.response.statusCode; } freeMessage(&response); @@ -304,16 +321,17 @@ int performRtspHandshake(void) { { RTSP_MESSAGE response; + int error = -1; - if (!requestDescribe(&response)) { - Limelog("RTSP DESCRIBE request failed\n"); - return -1; + if (!requestDescribe(&response, &error)) { + Limelog("RTSP DESCRIBE request failed: %d\n", error); + return error; } if (response.message.response.statusCode != 200) { Limelog("RTSP DESCRIBE request failed: %d\n", response.message.response.statusCode); - return -1; + return response.message.response.statusCode; } freeMessage(&response); @@ -322,16 +340,17 @@ int performRtspHandshake(void) { { RTSP_MESSAGE response; char* sessionId; + int error = -1; - if (!setupStream(&response, "streamid=audio")) { - Limelog("RTSP SETUP streamid=audio request failed\n"); - return -1; + if (!setupStream(&response, "streamid=audio", &error)) { + Limelog("RTSP SETUP streamid=audio request failed: %d\n", error); + return error; } if (response.message.response.statusCode != 200) { Limelog("RTSP SETUP streamid=audio request failed: %d\n", response.message.response.statusCode); - return -1; + return response.message.response.statusCode; } sessionId = getOptionContent(response.options, "Session"); @@ -348,16 +367,17 @@ int performRtspHandshake(void) { { RTSP_MESSAGE response; + int error = -1; - if (!setupStream(&response, "streamid=video")) { - Limelog("RTSP SETUP streamid=video request failed\n"); - return -1; + if (!setupStream(&response, "streamid=video", &error)) { + Limelog("RTSP SETUP streamid=video request failed: %d\n", error); + return error; } if (response.message.response.statusCode != 200) { Limelog("RTSP SETUP streamid=video request failed: %d\n", response.message.response.statusCode); - return -1; + return response.message.response.statusCode; } freeMessage(&response); @@ -365,16 +385,17 @@ int performRtspHandshake(void) { { RTSP_MESSAGE response; + int error = -1; - if (!sendVideoAnnounce(&response, &StreamConfig)) { - Limelog("RTSP ANNOUNCE request failed\n"); - return -1; + if (!sendVideoAnnounce(&response, &error)) { + Limelog("RTSP ANNOUNCE request failed: %d\n", error); + return error; } if (response.message.response.statusCode != 200) { Limelog("RTSP ANNOUNCE request failed: %d\n", response.message.response.statusCode); - return -1; + return response.message.response.statusCode; } freeMessage(&response); @@ -382,16 +403,17 @@ int performRtspHandshake(void) { { RTSP_MESSAGE response; + int error = -1; - if (!playStream(&response, "streamid=video")) { - Limelog("RTSP PLAY streamid=video request failed\n"); - return -1; + if (!playStream(&response, "streamid=video", &error)) { + Limelog("RTSP PLAY streamid=video request failed: %d\n", error); + return error; } if (response.message.response.statusCode != 200) { Limelog("RTSP PLAY streamid=video failed: %d\n", response.message.response.statusCode); - return -1; + return response.message.response.statusCode; } freeMessage(&response); @@ -399,16 +421,17 @@ int performRtspHandshake(void) { { RTSP_MESSAGE response; + int error = -1; - if (!playStream(&response, "streamid=audio")) { - Limelog("RTSP PLAY streamid=audio request failed\n"); - return -1; + if (!playStream(&response, "streamid=audio", &error)) { + Limelog("RTSP PLAY streamid=audio request failed: %d\n", error); + return error; } if (response.message.response.statusCode != 200) { Limelog("RTSP PLAY streamid=audio failed: %d\n", response.message.response.statusCode); - return -1; + return response.message.response.statusCode; } freeMessage(&response); diff --git a/limelight-common/VideoDepacketizer.c b/limelight-common/VideoDepacketizer.c index 809008c..fdb5dd7 100644 --- a/limelight-common/VideoDepacketizer.c +++ b/limelight-common/VideoDepacketizer.c @@ -185,7 +185,7 @@ static void reassembleAvcFrame(int frameNumber) { nalChainDataLength = 0; 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 nalChainHead = qdu->decodeUnit.bufferList; diff --git a/limelight-common/VideoStream.c b/limelight-common/VideoStream.c index 8f62178..d7adadf 100644 --- a/limelight-common/VideoStream.c +++ b/limelight-common/VideoStream.c @@ -49,7 +49,7 @@ static void UdpPingThreadProc(void *context) { while (!PltIsThreadInterrupted(&udpPingThread)) { err = sendto(rtpSocket, pingData, sizeof(pingData), 0, (struct sockaddr*)&saddr, RemoteAddrLen); if (err != sizeof(pingData)) { - Limelog("UDP ping thread terminating #1\n"); + Limelog("Video Ping: send() failed: %d\n", (int)LastSocketError()); ListenerCallbacks.connectionTerminated(LastSocketError()); return; } @@ -75,7 +75,7 @@ static void ReceiveThreadProc(void* context) { if (buffer == NULL) { buffer = (char*) malloc(bufferSize); if (buffer == NULL) { - Limelog("Receive thread terminating\n"); + Limelog("Video Receive: malloc() failed\n"); ListenerCallbacks.connectionTerminated(-1); return; } @@ -83,7 +83,7 @@ static void ReceiveThreadProc(void* context) { err = (int) recv(rtpSocket, buffer, receiveSize, 0); if (err <= 0) { - Limelog("Receive thread terminating #2\n"); + Limelog("Video Receive: recv() failed: %d\n", (int)LastSocketError()); ListenerCallbacks.connectionTerminated(LastSocketError()); break; } @@ -123,7 +123,6 @@ static void DecoderThreadProc(void* context) { PQUEUED_DECODE_UNIT qdu; while (!PltIsThreadInterrupted(&decoderThread)) { if (!getNextQueuedDecodeUnit(&qdu)) { - Limelog("Decoder thread terminating\n"); return; }