1 #include <stdio.h>
2 #include <string.h>
3 #include <stdlib.h>
4 
5 #define TYPE_REQUEST 0
6 #define TYPE_RESPONSE 1
7 
8 #define TOKEN_OPTION 0
9 
10 #define RTSP_ERROR_SUCCESS 0
11 #define RTSP_ERROR_NO_MEMORY -1
12 #define RTSP_ERROR_MALFORMED -2
13 
14 #define SEQ_INVALID -1
15 
16 #define FLAG_ALLOCATED_OPTION_FIELDS 0x1
17 #define FLAG_ALLOCATED_MESSAGE_BUFFER 0x2
18 #define FLAG_ALLOCATED_OPTION_ITEMS 0x4
19 #define FLAG_ALLOCATED_PAYLOAD 0x8
20 
21 #define CRLF_LENGTH 2
22 #define MESSAGE_END_LENGTH (2 + CRLF_LENGTH)
23 
24 typedef struct _OPTION_ITEM {
25     char flags;
26     char* option;
27     char* content;
28     struct _OPTION_ITEM* next;
29 } OPTION_ITEM, *POPTION_ITEM;
30 
31 // In this implementation, a flag indicates the message type:
32 // TYPE_REQUEST = 0
33 // TYPE_RESPONSE = 1
34 typedef struct _RTSP_MESSAGE {
35     char type;
36     char flags;
37     int sequenceNumber;
38     char* protocol;
39     POPTION_ITEM options;
40     char* payload;
41     int payloadLength;
42 
43     char* messageBuffer;
44 
45     union {
46         struct {
47             // Request fields
48             char* command;
49             char* target;
50         } request;
51         struct {
52             // Response fields
53             char* statusString;
54             int statusCode;
55         } response;
56     } message;
57 } RTSP_MESSAGE, *PRTSP_MESSAGE;
58 
59 int parseRtspMessage(PRTSP_MESSAGE msg, char* rtspMessage, int length);
60 void freeMessage(PRTSP_MESSAGE msg);
61 void createRtspResponse(PRTSP_MESSAGE msg, char* messageBuffer, int flags, char* protocol, int statusCode, char* statusString, int sequenceNumber, POPTION_ITEM optionsHead, char* payload, int payloadLength);
62 void createRtspRequest(PRTSP_MESSAGE msg, char* messageBuffer, int flags, char* command, char* target, char* protocol, int sequenceNumber, POPTION_ITEM optionsHead, char* payload, int payloadLength);
63 char* getOptionContent(POPTION_ITEM optionsHead, char* option);
64 void insertOption(POPTION_ITEM* optionsHead, POPTION_ITEM opt);
65 void freeOptionList(POPTION_ITEM optionsHead);
66 char* serializeRtspMessage(PRTSP_MESSAGE msg, int* serializedLength);
67