diff --git a/limelight-common/RtspConnection.c b/limelight-common/RtspConnection.c index 05c6801..9dce6d6 100644 --- a/limelight-common/RtspConnection.c +++ b/limelight-common/RtspConnection.c @@ -8,12 +8,13 @@ static char rtspTargetUrl[256]; static char sessionIdString[16]; static int hasSessionId = 0; -// GFE 2.1.1 +/* GFE 2.1.1 */ #define RTSP_CLIENT_VERSION 10 #define RTSP_CLIENT_VERSION_S "10" #define RTSP_MAX_RESP_SIZE 16384 +/* Create RTSP Option */ static POPTION_ITEM createOptionItem(char* option, char* content) { POPTION_ITEM item = malloc(sizeof(*item)); @@ -44,6 +45,7 @@ static POPTION_ITEM createOptionItem(char* option, char* content) return item; } +/* Add an option to the RTSP Message */ static int addOption(PRTSP_MESSAGE msg, char* option, char* content) { POPTION_ITEM item = createOptionItem(option, content); @@ -57,6 +59,7 @@ static int addOption(PRTSP_MESSAGE msg, char* option, char* content) return 1; } +/* Create an RTSP Request */ static int initializeRtspRequest(PRTSP_MESSAGE msg, char* command, char* target) { char sequenceNumberStr[16]; @@ -137,6 +140,7 @@ Exit: return ret; } +/* Terminate the RTSP Handshake process by closing the socket */ void terminateRtspHandshake(void) { if (sock != INVALID_SOCKET) { closesocket(sock); @@ -144,6 +148,7 @@ void terminateRtspHandshake(void) { } } +/* Send RTSP OPTIONS request */ static int requestOptions(PRTSP_MESSAGE response) { RTSP_MESSAGE request; int ret; @@ -157,6 +162,7 @@ static int requestOptions(PRTSP_MESSAGE response) { return ret; } +/* Send RTSP DESCRIBE request */ static int requestDescribe(PRTSP_MESSAGE response) { RTSP_MESSAGE request; int ret; @@ -178,6 +184,7 @@ static int requestDescribe(PRTSP_MESSAGE response) { return ret; } +/* Send RTSP SETUP request */ static int setupStream(PRTSP_MESSAGE response, char* target) { RTSP_MESSAGE request; int ret; @@ -207,6 +214,7 @@ static int setupStream(PRTSP_MESSAGE response, char* target) { return ret; } +/* Send RTSP PLAY request*/ static int playStream(PRTSP_MESSAGE response, char* target) { RTSP_MESSAGE request; int ret; @@ -225,6 +233,7 @@ static int playStream(PRTSP_MESSAGE response, char* target) { return ret; } +/* Send RTSP ANNOUNCE message */ static int sendVideoAnnounce(PRTSP_MESSAGE response, PSTREAM_CONFIGURATION streamConfig) { RTSP_MESSAGE request; int ret; @@ -263,6 +272,7 @@ static int sendVideoAnnounce(PRTSP_MESSAGE response, PSTREAM_CONFIGURATION strea return ret; } +/* Perform RTSP Handshake with the streaming server machine as part of the connection process */ int performRtspHandshake(IP_ADDRESS addr, PSTREAM_CONFIGURATION streamConfigPtr) { struct in_addr inaddr; diff --git a/limelight-common/VideoDepacketizer.c b/limelight-common/VideoDepacketizer.c index 7e7c047..19a58e0 100644 --- a/limelight-common/VideoDepacketizer.c +++ b/limelight-common/VideoDepacketizer.c @@ -26,11 +26,13 @@ typedef struct _BUFFER_DESC { unsigned int length; } BUFFER_DESC, *PBUFFER_DESC; +/* Init */ void initializeVideoDepacketizer(int pktSize) { LbqInitializeLinkedBlockingQueue(&decodeUnitQueue, 15); nominalPacketDataLength = pktSize - sizeof(NV_VIDEO_PACKET); } +/* Free malloced memory in AvcFrameState*/ static void cleanupAvcFrameState(void) { PLENTRY lastEntry; @@ -49,6 +51,7 @@ static void dropAvcFrameState(void) { cleanupAvcFrameState(); } +/* Cleanup video depacketizer and free malloced memory */ void destroyVideoDepacketizer(void) { PLINKED_BLOCKING_QUEUE_ENTRY entry, nextEntry; @@ -63,18 +66,22 @@ void destroyVideoDepacketizer(void) { cleanupAvcFrameState(); } +/* Returns 1 if candidate is a frame start and 0 otherwise */ static int isSeqFrameStart(PBUFFER_DESC candidate) { return (candidate->length == 4 && candidate->data[candidate->offset + candidate->length - 1] == 1); } +/* Returns 1 if candidate an AVC start and 0 otherwise */ static int isSeqAvcStart(PBUFFER_DESC candidate) { return (candidate->data[candidate->offset + candidate->length - 1] == 1); } +/* Returns 1 if candidate is padding and 0 otherwise */ static int isSeqPadding(PBUFFER_DESC candidate) { return (candidate->data[candidate->offset + candidate->length - 1] == 0); } +/* Returns 1 on success, 0 otherwise */ static int getSpecialSeq(PBUFFER_DESC current, PBUFFER_DESC candidate) { if (current->length < 3) { return 0; @@ -111,6 +118,7 @@ static int getSpecialSeq(PBUFFER_DESC current, PBUFFER_DESC candidate) { return 0; } +/* Reassemble the frame with the given frame number */ static void reassembleAvcFrame(int frameNumber) { if (nalChainHead != NULL) { PDECODE_UNIT du = (PDECODE_UNIT) malloc(sizeof(*du)); @@ -142,6 +150,7 @@ static void reassembleAvcFrame(int frameNumber) { } } +/* Given a decode unit, get the next one in the linked blocking queue */ int getNextDecodeUnit(PDECODE_UNIT *du) { int err = LbqWaitForQueueElement(&decodeUnitQueue, (void**)du); if (err == LBQ_SUCCESS) { @@ -152,6 +161,7 @@ int getNextDecodeUnit(PDECODE_UNIT *du) { } } +/* Cleanup a decode unit by freeing malloced memory */ void freeDecodeUnit(PDECODE_UNIT decodeUnit) { PLENTRY lastEntry; @@ -259,6 +269,7 @@ static void processRtpPayloadSlow(PNV_VIDEO_PACKET videoPacket, PBUFFER_DESC cur } } +/* Return 1 if packet is the first one in the frame */ static int isFirstPacket(char flags) { // Clear the picture data flag flags &= ~FLAG_CONTAINS_PIC_DATA; @@ -268,7 +279,9 @@ static int isFirstPacket(char flags) { flags == FLAG_SOF); } +/* Adds a fragment directly to the queue */ static void processRtpPayloadFast(PNV_VIDEO_PACKET videoPacket, BUFFER_DESC location) { + // FIXME not using videoPacket parameter?? queueFragment(location.data, location.offset, location.length); } @@ -439,6 +452,7 @@ void processRtpPayload(PNV_VIDEO_PACKET videoPacket, int length) { } } +/* Add an RTP Packet to the queue */ void queueRtpPacket(PRTP_PACKET rtpPacket, int length) { int dataOffset;