1/* 2 * RTSP definitions 3 * Copyright (c) 2002 Fabrice Bellard 4 * 5 * This file is part of FFmpeg. 6 * 7 * FFmpeg is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU Lesser General Public 9 * License as published by the Free Software Foundation; either 10 * version 2.1 of the License, or (at your option) any later version. 11 * 12 * FFmpeg is distributed in the hope that it will be useful, 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 * Lesser General Public License for more details. 16 * 17 * You should have received a copy of the GNU Lesser General Public 18 * License along with FFmpeg; if not, write to the Free Software 19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20 */ 21#ifndef FFMPEG_RTSP_H 22#define FFMPEG_RTSP_H 23 24#include <stdint.h> 25#include "avformat.h" 26#include "rtspcodes.h" 27#include "rtpdec.h" 28#include "network.h" 29 30/** 31 * Network layer over which RTP/etc packet data will be transported. 32 */ 33enum RTSPLowerTransport { 34 RTSP_LOWER_TRANSPORT_UDP = 0, /**< UDP/unicast */ 35 RTSP_LOWER_TRANSPORT_TCP = 1, /**< TCP; interleaved in RTSP */ 36 RTSP_LOWER_TRANSPORT_UDP_MULTICAST = 2, /**< UDP/multicast */ 37 RTSP_LOWER_TRANSPORT_NB 38}; 39 40/** 41 * Packet profile of the data that we will be receiving. Real servers 42 * commonly send RDT (although they can sometimes send RTP as well), 43 * whereas most others will send RTP. 44 */ 45enum RTSPTransport { 46 RTSP_TRANSPORT_RTP, /**< Standards-compliant RTP */ 47 RTSP_TRANSPORT_RDT, /**< Realmedia Data Transport */ 48 RTSP_TRANSPORT_NB 49}; 50 51#define RTSP_DEFAULT_PORT 554 52#define RTSP_MAX_TRANSPORTS 8 53#define RTSP_TCP_MAX_PACKET_SIZE 1472 54#define RTSP_DEFAULT_NB_AUDIO_CHANNELS 2 55#define RTSP_DEFAULT_AUDIO_SAMPLERATE 44100 56#define RTSP_RTP_PORT_MIN 5000 57#define RTSP_RTP_PORT_MAX 10000 58 59/** 60 * This describes a single item in the "Transport:" line of one stream as 61 * negotiated by the SETUP RTSP command. Multiple transports are comma- 62 * separated ("Transport: x-read-rdt/tcp;interleaved=0-1,rtp/avp/udp; 63 * client_port=1000-1001;server_port=1800-1801") and described in separate 64 * RTSPTransportFields. 65 */ 66typedef struct RTSPTransportField { 67 /** interleave ids, if TCP transport; each TCP/RTSP data packet starts 68 * with a '$', stream length and stream ID. If the stream ID is within 69 * the range of this interleaved_min-max, then the packet belongs to 70 * this stream. */ 71 int interleaved_min, interleaved_max; 72 73 /** UDP multicast port range; the ports to which we should connect to 74 * receive multicast UDP data. */ 75 int port_min, port_max; 76 77 /** UDP client ports; these should be the local ports of the UDP RTP 78 * (and RTCP) sockets over which we receive RTP/RTCP data. */ 79 int client_port_min, client_port_max; 80 81 /** UDP unicast server port range; the ports to which we should connect 82 * to receive unicast UDP RTP/RTCP data. */ 83 int server_port_min, server_port_max; 84 85 /** time-to-live value (required for multicast); the amount of HOPs that 86 * packets will be allowed to make before being discarded. */ 87 int ttl; 88 89 uint32_t destination; /**< destination IP address */ 90 91 /** data/packet transport protocol; e.g. RTP or RDT */ 92 enum RTSPTransport transport; 93 94 /** network layer transport protocol; e.g. TCP or UDP uni-/multicast */ 95 enum RTSPLowerTransport lower_transport; 96} RTSPTransportField; 97 98/** 99 * This describes the server response to each RTSP command. 100 */ 101typedef struct RTSPMessageHeader { 102 /** length of the data following this header */ 103 int content_length; 104 105 enum RTSPStatusCode status_code; /**< response code from server */ 106 107 /** number of items in the 'transports' variable below */ 108 int nb_transports; 109 110 /** Time range of the streams that the server will stream. In 111 * AV_TIME_BASE unit, AV_NOPTS_VALUE if not used */ 112 int64_t range_start, range_end; 113 114 /** describes the complete "Transport:" line of the server in response 115 * to a SETUP RTSP command by the client */ 116 RTSPTransportField transports[RTSP_MAX_TRANSPORTS]; 117 118 int seq; /**< sequence number */ 119 120 /** the "Session:" field. This value is initially set by the server and 121 * should be re-transmitted by the client in every RTSP command. */ 122 char session_id[512]; 123 124 /** the "RealChallenge1:" field from the server */ 125 char real_challenge[64]; 126 127 /** the "Server: field, which can be used to identify some special-case 128 * servers that are not 100% standards-compliant. We use this to identify 129 * Windows Media Server, which has a value "WMServer/v.e.r.sion", where 130 * version is a sequence of digits (e.g. 9.0.0.3372). Helix/Real servers 131 * use something like "Helix [..] Server Version v.e.r.sion (platform) 132 * (RealServer compatible)" or "RealServer Version v.e.r.sion (platform)", 133 * where platform is the output of $uname -msr | sed 's/ /-/g'. */ 134 char server[64]; 135} RTSPMessageHeader; 136 137/** 138 * Client state, i.e. whether we are currently receiving data (PLAYING) or 139 * setup-but-not-receiving (PAUSED). State can be changed in applications 140 * by calling av_read_play/pause(). 141 */ 142enum RTSPClientState { 143 RTSP_STATE_IDLE, /**< not initialized */ 144 RTSP_STATE_PLAYING, /**< initialized and receiving data */ 145 RTSP_STATE_PAUSED, /**< initialized, but not receiving data */ 146}; 147 148/** 149 * Identifies particular servers that require special handling, such as 150 * standards-incompliant "Transport:" lines in the SETUP request. 151 */ 152enum RTSPServerType { 153 RTSP_SERVER_RTP, /**< Standards-compliant RTP-server */ 154 RTSP_SERVER_REAL, /**< Realmedia-style server */ 155 RTSP_SERVER_WMS, /**< Windows Media server */ 156 RTSP_SERVER_NB 157}; 158 159/** 160 * Private data for the RTSP demuxer. 161 */ 162typedef struct RTSPState { 163 URLContext *rtsp_hd; /* RTSP TCP connexion handle */ 164 165 /** number of items in the 'rtsp_streams' variable */ 166 int nb_rtsp_streams; 167 168 struct RTSPStream **rtsp_streams; /**< streams in this session */ 169 170 /** indicator of whether we are currently receiving data from the 171 * server. Basically this isn't more than a simple cache of the 172 * last PLAY/PAUSE command sent to the server, to make sure we don't 173 * send 2x the same unexpectedly or commands in the wrong state. */ 174 enum RTSPClientState state; 175 176 /** the seek value requested when calling av_seek_frame(). This value 177 * is subsequently used as part of the "Range" parameter when emitting 178 * the RTSP PLAY command. If we are currently playing, this command is 179 * called instantly. If we are currently paused, this command is called 180 * whenever we resume playback. Either way, the value is only used once, 181 * see rtsp_read_play() and rtsp_read_seek(). */ 182 int64_t seek_timestamp; 183 184 /* XXX: currently we use unbuffered input */ 185 // ByteIOContext rtsp_gb; 186 187 int seq; /**< RTSP command sequence number */ 188 189 /** copy of RTSPMessageHeader->session_id, i.e. the server-provided session 190 * identifier that the client should re-transmit in each RTSP command */ 191 char session_id[512]; 192 193 /** the negotiated data/packet transport protocol; e.g. RTP or RDT */ 194 enum RTSPTransport transport; 195 196 /** the negotiated network layer transport protocol; e.g. TCP or UDP 197 * uni-/multicast */ 198 enum RTSPLowerTransport lower_transport; 199 200 /** brand of server that we're talking to; e.g. WMS, REAL or other. 201 * Detected based on the value of RTSPMessageHeader->server or the presence 202 * of RTSPMessageHeader->real_challenge */ 203 enum RTSPServerType server_type; 204 205 /** The last reply of the server to a RTSP command */ 206 char last_reply[2048]; /* XXX: allocate ? */ 207 208 /** RTSPStream->transport_priv of the last stream that we read a 209 * packet from */ 210 void *cur_transport_priv; 211 212 /** The following are used for Real stream selection */ 213 //@{ 214 /** whether we need to send a "SET_PARAMETER Subscribe:" command */ 215 int need_subscription; 216 217 /** stream setup during the last frame read. This is used to detect if 218 * we need to subscribe or unsubscribe to any new streams. */ 219 enum AVDiscard real_setup_cache[MAX_STREAMS]; 220 221 /** the last value of the "SET_PARAMETER Subscribe:" RTSP command. 222 * this is used to send the same "Unsubscribe:" if stream setup changed, 223 * before sending a new "Subscribe:" command. */ 224 char last_subscription[1024]; 225 //@} 226} RTSPState; 227 228/** 229 * Describes a single stream, as identified by a single m= line block in the 230 * SDP content. In the case of RDT, one RTSPStream can represent multiple 231 * AVStreams. In this case, each AVStream in this set has similar content 232 * (but different codec/bitrate). 233 */ 234typedef struct RTSPStream { 235 URLContext *rtp_handle; /**< RTP stream handle (if UDP) */ 236 void *transport_priv; /**< RTP/RDT parse context */ 237 238 /** corresponding stream index, if any. -1 if none (MPEG2TS case) */ 239 int stream_index; 240 241 /** interleave IDs; copies of RTSPTransportField->interleaved_min/max 242 * for the selected transport. Only used for TCP. */ 243 int interleaved_min, interleaved_max; 244 245 char control_url[1024]; /**< url for this stream (from SDP) */ 246 247 /** The following are used only in SDP, not RTSP */ 248 //@{ 249 int sdp_port; /**< port (from SDP content) */ 250 struct in_addr sdp_ip; /**< IP address (from SDP content) */ 251 int sdp_ttl; /**< IP Time-To-Live (from SDP content) */ 252 int sdp_payload_type; /**< payload type */ 253 //@} 254 255 /** rtp payload parsing infos from SDP (i.e. mapping between private 256 * payload IDs and media-types (string), so that we can derive what 257 * type of payload we're dealing with (and how to parse it). */ 258 RTPPayloadData rtp_payload_data; 259 260 /** The following are used for dynamic protocols (rtp_*.c/rdt.c) */ 261 //@{ 262 /** handler structure */ 263 RTPDynamicProtocolHandler *dynamic_handler; 264 265 /** private data associated with the dynamic protocol */ 266 PayloadContext *dynamic_protocol_context; 267 //@} 268} RTSPStream; 269 270int rtsp_init(void); 271void rtsp_parse_line(RTSPMessageHeader *reply, const char *buf); 272 273#if LIBAVFORMAT_VERSION_INT < (53 << 16) 274extern int rtsp_default_protocols; 275#endif 276extern int rtsp_rtp_port_min; 277extern int rtsp_rtp_port_max; 278 279int rtsp_pause(AVFormatContext *s); 280int rtsp_resume(AVFormatContext *s); 281 282#endif /* FFMPEG_RTSP_H */ 283