Improve debugging and error codes

This commit is contained in:
Cameron Gutman 2015-06-24 22:52:26 -07:00
parent fc68cfd438
commit a5f59d206e
9 changed files with 91 additions and 63 deletions

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;
}