#ifndef _rtsp_header_transport_h_ #define _rtsp_header_transport_h_ #ifdef __cplusplus extern "C" { #endif enum { RTSP_TRANSPORT_UNICAST = 1, RTSP_TRANSPORT_MULTICAST, }; // transport enum { RTSP_TRANSPORT_RTP_UDP = 1, RTSP_TRANSPORT_RTP_TCP, RTSP_TRANSPORT_RAW, }; // transport mode enum { RTSP_TRANSPORT_PLAY = 1, RTSP_TRANSPORT_RECORD }; // Transport: RTP/AVP/TCP;interleaved=0-1 // Transport: RTP/AVP;unicast;client_port=4588-4589;server_port=6256-6257 // Transport: RTP/AVP;multicast;destination=224.2.0.1;port=3456-3457;ttl=16 struct rtsp_header_transport_t { int transport; // RTSP_TRANSPORT_xxx int multicast; // 0-unicast/1-multicast, default multicast char destination[65]; // IPv4/IPv6 char source[65]; // IPv4/IPv6 int layer; // rtsp setup response only int mode; // PLAY/RECORD, default PLAY, rtsp setup response only int append; // use with RECORD mode only, rtsp setup response only int interleaved1, interleaved2; // rtsp setup response only union rtsp_header_transport_rtp_u { struct rtsp_header_transport_multicast_t { int ttl; // multicast only unsigned short port1, port2; // multicast only } m; struct rtsp_header_transport_unicast_t { unsigned short client_port1, client_port2; // unicast RTP/RTCP port pair, RTP only unsigned short server_port1, server_port2; // unicast RTP/RTCP port pair, RTP only unsigned int ssrc; // RTP only(synchronization source (SSRC) identifier) 4-bytes } u; } rtp; }; /// parse RTSP Transport header /// @return 0-ok, other-error /// usage 1: /// struct rtsp_header_transport_t transport; /// const char* header = "Transport: RTP/AVP;unicast;client_port=4588-4589;server_port=6256-6257"; /// r = rtsp_header_transport("RTP/AVP;unicast;client_port=4588-4589;server_port=6256-6257", &transport); /// check(r) /// /// usage 2: /// const char* header = "Transport: RTP/AVP;unicast;client_port=4588-4589;server_port=6256-6257,RTP/AVP;unicast;client_port=5000-5001;server_port=6000-6001"; /// split(header, ','); /// r1 = rtsp_header_transport("RTP/AVP;unicast;client_port=4588-4589;server_port=6256-6257", &transport); /// r2 = rtsp_header_transport("RTP/AVP;unicast;client_port=5000-5001;server_port=6000-6001", &transport); /// check(r1, r2) int rtsp_header_transport(const char* field, struct rtsp_header_transport_t* transport); #ifdef __cplusplus } #endif #endif /* !_rtsp_header_transport_h_ */