1 // PHZ 2 // 2018-6-8 3 4 #ifndef XOP_RTSP_MESSAGE_H 5 #define XOP_RTSP_MESSAGE_H 6 7 #include <utility> 8 #include <unordered_map> 9 #include <string> 10 #include <cstring> 11 #include "rtp.h" 12 #include "media.h" 13 #include "net/BufferReader.h" 14 15 namespace xop 16 { 17 18 class RtspRequest 19 { 20 public: 21 enum Method 22 { 23 OPTIONS=0, DESCRIBE, SETUP, PLAY, TEARDOWN, GET_PARAMETER, 24 RTCP, NONE, 25 }; 26 27 const char* MethodToString[8] = 28 { 29 "OPTIONS", "DESCRIBE", "SETUP", "PLAY", "TEARDOWN", "GET_PARAMETER", 30 "RTCP", "NONE" 31 }; 32 33 enum RtspRequestParseState 34 { 35 kParseRequestLine, 36 kParseHeadersLine, 37 //kParseBody, 38 kGotAll, 39 }; 40 41 bool ParseRequest(xop::BufferReader *buffer); 42 GotAll()43 bool GotAll() const 44 { return state_ == kGotAll; } 45 Reset()46 void Reset() 47 { 48 state_ = kParseRequestLine; 49 request_line_param_.clear(); 50 header_line_param_.clear(); 51 } 52 GetMethod()53 Method GetMethod() const 54 { return method_; } 55 56 uint32_t GetCSeq() const; 57 58 std::string GetRtspUrl() const; 59 60 std::string GetRtspUrlSuffix() const; 61 std::string GetRtspUrlSession() const; 62 std::string GetRtspUrlQueryString() const; 63 64 std::string GetIp() const; 65 66 std::string GetAuthResponse() const; 67 GetTransportMode()68 TransportMode GetTransportMode() const 69 { return transport_; } 70 GetChannelId()71 MediaChannelId GetChannelId() const 72 { return channel_id_; } 73 74 uint8_t GetRtpChannel() const; 75 uint8_t GetRtcpChannel() const; 76 uint16_t GetRtpPort() const; 77 uint16_t GetRtcpPort() const; 78 79 int BuildOptionRes(const char* buf, int buf_size); 80 int BuildDescribeRes(const char* buf, int buf_size, const char* sdp); 81 int BuildSetupMulticastRes(const char* buf, int buf_size, const char* multicast_ip, uint16_t port, uint32_t session_id); 82 int BuildSetupTcpRes(const char* buf, int buf_size, uint16_t rtp_chn, uint16_t rtcp_chn, uint32_t session_id); 83 int BuildSetupUdpRes(const char* buf, int buf_size, uint16_t rtp_chn, uint16_t rtcp_chn, uint32_t session_id); 84 int BuildPlayRes(const char* buf, int buf_size, const char* rtp_info, uint32_t session_id); 85 int BuildTeardownRes(const char* buf, int buf_size, uint32_t session_id); 86 int BuildGetParamterRes(const char* buf, int buf_size, uint32_t session_id); 87 int BuildNotFoundRes(const char* buf, int buf_size); 88 int BuildServerErrorRes(const char* buf, int buf_size); 89 int BuildUnsupportedRes(const char* buf, int buf_size); 90 size_t BuildUnauthorizedRes(const char* buf, size_t buf_size); 91 size_t BuildUnauthorizedRes(const char* buf, size_t buf_size, const char* realm, const char* nonce); 92 93 private: 94 bool ParseRequestLine(const char* begin, const char* end); 95 bool ParseHeadersLine(const char* begin, const char* end); 96 bool ParseCSeq(std::string& message); 97 bool ParseAccept(std::string& message); 98 bool ParseTransport(std::string& message); 99 bool ParseSessionId(std::string& message); 100 bool ParseMediaChannel(std::string& message); 101 bool ParseAuthorization(std::string& message); 102 103 Method method_; 104 MediaChannelId channel_id_; 105 TransportMode transport_; 106 std::string auth_response_; 107 std::unordered_map<std::string, std::pair<std::string, uint32_t>> request_line_param_; 108 std::unordered_map<std::string, std::pair<std::string, uint32_t>> header_line_param_; 109 110 RtspRequestParseState state_ = kParseRequestLine; 111 }; 112 113 class RtspResponse 114 { 115 public: 116 enum Method 117 { 118 OPTIONS=0, DESCRIBE, ANNOUNCE, SETUP, RECORD, RTCP, 119 NONE, 120 }; 121 122 bool ParseResponse(xop::BufferReader *buffer); 123 GetMethod()124 Method GetMethod() const 125 { return method_; } 126 GetCSeq()127 uint32_t GetCSeq() const 128 { return cseq_; } 129 GetSession()130 std::string GetSession() const 131 { return session_; } 132 SetUserAgent(const char * user_agent)133 void SetUserAgent(const char *user_agent) 134 { user_agent_ = std::string(user_agent); } 135 SetRtspUrl(const char * url)136 void SetRtspUrl(const char *url) 137 { rtsp_url_ = std::string(url); } 138 139 int BuildOptionReq(const char* buf, int buf_size); 140 int BuildDescribeReq(const char* buf, int buf_size); 141 int BuildAnnounceReq(const char* buf, int buf_size, const char *sdp); 142 int BuildSetupTcpReq(const char* buf, int buf_size, int channel); 143 int BuildRecordReq(const char* buf, int buf_size); 144 145 private: 146 Method method_; 147 uint32_t cseq_ = 0; 148 std::string user_agent_; 149 std::string rtsp_url_; 150 std::string session_; 151 }; 152 153 } 154 155 #endif 156