/* Send RTSP message and get response */ static int transactRtspMessage(PRTSP_MESSAGE request, PRTSP_MESSAGE response) { SOCK_RET err; int ret = 0; int offset; char* serializedMessage = NULL; int messageLen; sock = connectTcpSocket(remoteAddr, 48010); if (sock == INVALID_SOCKET) { return ret; } enableNoDelay(sock); serializedMessage = serializeRtspMessage(request, &messageLen); if (serializedMessage == NULL) { closesocket(sock); return ret; } // Send our message err = send(sock, serializedMessage, messageLen, 0); if (err == SOCKET_ERROR) { goto Exit; } // Read the response until the server closes the connection offset = 0; for (;;) { err = recv(sock, &responseBuffer[offset], RTSP_MAX_RESP_SIZE - offset, 0); if (err <= 0) { // Done reading break; } offset += err; // Warn if the RTSP message is too big if (offset == RTSP_MAX_RESP_SIZE) { Limelog("RTSP message too long\n"); goto Exit; } } if (parseRtspMessage(response, responseBuffer, offset) == RTSP_ERROR_SUCCESS) { // Successfully parsed response ret = 1; } else { Limelog("Failed to parse RTSP response\n"); } Exit: if (serializedMessage != NULL) { free(serializedMessage); } closesocket(sock); sock = INVALID_SOCKET; return ret; }
/* Begin the input stream */ int startInputStream(void) { int err; inputSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 35043); if (inputSock == INVALID_SOCKET) { return LastSocketFail(); } enableNoDelay(inputSock); err = PltCreateThread(inputSendThreadProc, NULL, &inputSendThread); if (err != 0) { return err; } return err; }
/* Starts the control stream */ int startControlStream(void) { int err; ctlSock = connectTcpSocket(&RemoteAddr, RemoteAddrLen, 47995); if (ctlSock == INVALID_SOCKET) { return LastSocketFail(); } enableNoDelay(ctlSock); // Send START A if (!sendMessageAndDiscardReply(packetTypes[IDX_START_A], payloadLengths[IDX_START_A], preconstructedPayloads[IDX_START_A])) { 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])) { Limelog("Start B failed: %d\n", (int)LastSocketError()); return LastSocketFail(); } err = PltCreateThread(lossStatsThreadFunc, NULL, &lossStatsThread); if (err != 0) { return err; } err = PltCreateThread(resyncThreadFunc, NULL, &resyncThread); if (err != 0) { return err; } return 0; }