ffmpeg / libavformat / rtsp.h @ c07c6f81
History | View | Annotate | Download (15.8 KB)
1 | 1617ad97 | Fabrice Bellard | /*
|
---|---|---|---|
2 | * RTSP definitions
|
||
3 | 406792e7 | Diego Biurrun | * Copyright (c) 2002 Fabrice Bellard
|
4 | 1617ad97 | Fabrice Bellard | *
|
5 | b78e7197 | Diego Biurrun | * This file is part of FFmpeg.
|
6 | *
|
||
7 | * FFmpeg is free software; you can redistribute it and/or
|
||
8 | 1617ad97 | Fabrice Bellard | * modify it under the terms of the GNU Lesser General Public
|
9 | * License as published by the Free Software Foundation; either
|
||
10 | b78e7197 | Diego Biurrun | * version 2.1 of the License, or (at your option) any later version.
|
11 | 1617ad97 | Fabrice Bellard | *
|
12 | b78e7197 | Diego Biurrun | * FFmpeg is distributed in the hope that it will be useful,
|
13 | 1617ad97 | Fabrice Bellard | * 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 | b78e7197 | Diego Biurrun | * License along with FFmpeg; if not, write to the Free Software
|
19 | 5509bffa | Diego Biurrun | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
20 | 1617ad97 | Fabrice Bellard | */
|
21 | 58ad770f | Stefano Sabatini | #ifndef AVFORMAT_RTSP_H
|
22 | #define AVFORMAT_RTSP_H
|
||
23 | 1617ad97 | Fabrice Bellard | |
24 | 99545457 | Måns Rullgård | #include <stdint.h> |
25 | #include "avformat.h" |
||
26 | 1617ad97 | Fabrice Bellard | #include "rtspcodes.h" |
27 | 302879cb | Luca Abeni | #include "rtpdec.h" |
28 | 74272b1c | Ronald S. Bultje | #include "network.h" |
29 | 1617ad97 | Fabrice Bellard | |
30 | 26d6b3e2 | Ronald S. Bultje | /**
|
31 | * Network layer over which RTP/etc packet data will be transported.
|
||
32 | */
|
||
33 | 90abbdba | Ronald S. Bultje | enum RTSPLowerTransport {
|
34 | 26d6b3e2 | Ronald S. Bultje | 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 | 2a1d51c5 | Ronald S. Bultje | RTSP_LOWER_TRANSPORT_NB |
38 | 1617ad97 | Fabrice Bellard | }; |
39 | |||
40 | 26d6b3e2 | Ronald S. Bultje | /**
|
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 | */
|
||
45 | 1262d638 | Ronald S. Bultje | enum RTSPTransport {
|
46 | 26d6b3e2 | Ronald S. Bultje | RTSP_TRANSPORT_RTP, /**< Standards-compliant RTP */
|
47 | RTSP_TRANSPORT_RDT, /**< Realmedia Data Transport */
|
||
48 | 2a1d51c5 | Ronald S. Bultje | RTSP_TRANSPORT_NB |
49 | 1262d638 | Ronald S. Bultje | }; |
50 | |||
51 | 1617ad97 | Fabrice Bellard | #define RTSP_DEFAULT_PORT 554 |
52 | #define RTSP_MAX_TRANSPORTS 8 |
||
53 | b7b8fc34 | Fabrice Bellard | #define RTSP_TCP_MAX_PACKET_SIZE 1472 |
54 | d1ccf0e0 | Romain Degez | #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 | 1617ad97 | Fabrice Bellard | |
59 | 26d6b3e2 | Ronald S. Bultje | /**
|
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 | */
|
||
66 | 1617ad97 | Fabrice Bellard | typedef struct RTSPTransportField { |
67 | 26d6b3e2 | Ronald S. Bultje | /** 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 | 37d2210a | Panagiotis Issaris | uint32_t destination; /**< destination IP address */
|
90 | 26d6b3e2 | Ronald S. Bultje | |
91 | /** data/packet transport protocol; e.g. RTP or RDT */
|
||
92 | 1262d638 | Ronald S. Bultje | enum RTSPTransport transport;
|
93 | 26d6b3e2 | Ronald S. Bultje | |
94 | /** network layer transport protocol; e.g. TCP or UDP uni-/multicast */
|
||
95 | 90abbdba | Ronald S. Bultje | enum RTSPLowerTransport lower_transport;
|
96 | 1617ad97 | Fabrice Bellard | } RTSPTransportField; |
97 | |||
98 | 26d6b3e2 | Ronald S. Bultje | /**
|
99 | * This describes the server response to each RTSP command.
|
||
100 | */
|
||
101 | a9e534d5 | Ronald S. Bultje | typedef struct RTSPMessageHeader { |
102 | 26d6b3e2 | Ronald S. Bultje | /** length of the data following this header */
|
103 | 1617ad97 | Fabrice Bellard | int content_length;
|
104 | 26d6b3e2 | Ronald S. Bultje | |
105 | 37d2210a | Panagiotis Issaris | enum RTSPStatusCode status_code; /**< response code from server */ |
106 | 26d6b3e2 | Ronald S. Bultje | |
107 | /** number of items in the 'transports' variable below */
|
||
108 | 1617ad97 | Fabrice Bellard | int nb_transports;
|
109 | 26d6b3e2 | Ronald S. Bultje | |
110 | /** Time range of the streams that the server will stream. In
|
||
111 | * AV_TIME_BASE unit, AV_NOPTS_VALUE if not used */
|
||
112 | 115329f1 | Diego Biurrun | int64_t range_start, range_end; |
113 | 26d6b3e2 | Ronald S. Bultje | |
114 | /** describes the complete "Transport:" line of the server in response
|
||
115 | * to a SETUP RTSP command by the client */
|
||
116 | 1617ad97 | Fabrice Bellard | RTSPTransportField transports[RTSP_MAX_TRANSPORTS]; |
117 | 26d6b3e2 | Ronald S. Bultje | |
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 | 1617ad97 | Fabrice Bellard | char session_id[512]; |
123 | 26d6b3e2 | Ronald S. Bultje | |
124 | d243ba30 | Luca Barbato | /** the "Location:" field. This value is used to handle redirection.
|
125 | */
|
||
126 | char location[4096]; |
||
127 | |||
128 | 26d6b3e2 | Ronald S. Bultje | /** the "RealChallenge1:" field from the server */
|
129 | char real_challenge[64]; |
||
130 | |||
131 | /** the "Server: field, which can be used to identify some special-case
|
||
132 | * servers that are not 100% standards-compliant. We use this to identify
|
||
133 | * Windows Media Server, which has a value "WMServer/v.e.r.sion", where
|
||
134 | * version is a sequence of digits (e.g. 9.0.0.3372). Helix/Real servers
|
||
135 | * use something like "Helix [..] Server Version v.e.r.sion (platform)
|
||
136 | * (RealServer compatible)" or "RealServer Version v.e.r.sion (platform)",
|
||
137 | * where platform is the output of $uname -msr | sed 's/ /-/g'. */
|
||
138 | 7a86bafa | Ronald S. Bultje | char server[64]; |
139 | 30e79845 | Ronald S. Bultje | |
140 | /** The "timeout" comes as part of the server response to the "SETUP"
|
||
141 | * command, in the "Session: <xyz>[;timeout=<value>]" line. It is the
|
||
142 | * time, in seconds, that the server will go without traffic over the
|
||
143 | * RTSP/TCP connection before it closes the connection. To prevent
|
||
144 | * this, sent dummy requests (e.g. OPTIONS) with intervals smaller
|
||
145 | * than this value. */
|
||
146 | int timeout;
|
||
147 | fccb1770 | Ronald S. Bultje | |
148 | /** The "Notice" or "X-Notice" field value. See
|
||
149 | * http://tools.ietf.org/html/draft-stiemerling-rtsp-announce-00
|
||
150 | * for a complete list of supported values. */
|
||
151 | int notice;
|
||
152 | a9e534d5 | Ronald S. Bultje | } RTSPMessageHeader; |
153 | 1617ad97 | Fabrice Bellard | |
154 | 26d6b3e2 | Ronald S. Bultje | /**
|
155 | * Client state, i.e. whether we are currently receiving data (PLAYING) or
|
||
156 | * setup-but-not-receiving (PAUSED). State can be changed in applications
|
||
157 | * by calling av_read_play/pause().
|
||
158 | */
|
||
159 | 74272b1c | Ronald S. Bultje | enum RTSPClientState {
|
160 | 26d6b3e2 | Ronald S. Bultje | RTSP_STATE_IDLE, /**< not initialized */
|
161 | c02fd3d2 | Martin Storsjö | RTSP_STATE_STREAMING, /**< initialized and sending/receiving data */
|
162 | 26d6b3e2 | Ronald S. Bultje | RTSP_STATE_PAUSED, /**< initialized, but not receiving data */
|
163 | ec606b36 | Luca Barbato | RTSP_STATE_SEEKING, /**< initialized, requesting a seek */
|
164 | 74272b1c | Ronald S. Bultje | }; |
165 | |||
166 | 26d6b3e2 | Ronald S. Bultje | /**
|
167 | * Identifies particular servers that require special handling, such as
|
||
168 | * standards-incompliant "Transport:" lines in the SETUP request.
|
||
169 | */
|
||
170 | 74272b1c | Ronald S. Bultje | enum RTSPServerType {
|
171 | 6e5f27ca | Ronald S. Bultje | RTSP_SERVER_RTP, /**< Standards-compliant RTP-server */
|
172 | 70d4b8ce | Ronald S. Bultje | RTSP_SERVER_REAL, /**< Realmedia-style server */
|
173 | RTSP_SERVER_WMS, /**< Windows Media server */
|
||
174 | 2a1d51c5 | Ronald S. Bultje | RTSP_SERVER_NB |
175 | 74272b1c | Ronald S. Bultje | }; |
176 | |||
177 | 26d6b3e2 | Ronald S. Bultje | /**
|
178 | * Private data for the RTSP demuxer.
|
||
179 | 9c610b76 | Ronald S. Bultje | *
|
180 | * @todo Use ByteIOContext instead of URLContext
|
||
181 | 26d6b3e2 | Ronald S. Bultje | */
|
182 | 74272b1c | Ronald S. Bultje | typedef struct RTSPState { |
183 | URLContext *rtsp_hd; /* RTSP TCP connexion handle */
|
||
184 | 26d6b3e2 | Ronald S. Bultje | |
185 | /** number of items in the 'rtsp_streams' variable */
|
||
186 | 74272b1c | Ronald S. Bultje | int nb_rtsp_streams;
|
187 | |||
188 | 26d6b3e2 | Ronald S. Bultje | struct RTSPStream **rtsp_streams; /**< streams in this session */ |
189 | |||
190 | /** indicator of whether we are currently receiving data from the
|
||
191 | * server. Basically this isn't more than a simple cache of the
|
||
192 | * last PLAY/PAUSE command sent to the server, to make sure we don't
|
||
193 | * send 2x the same unexpectedly or commands in the wrong state. */
|
||
194 | 74272b1c | Ronald S. Bultje | enum RTSPClientState state;
|
195 | 26d6b3e2 | Ronald S. Bultje | |
196 | /** the seek value requested when calling av_seek_frame(). This value
|
||
197 | * is subsequently used as part of the "Range" parameter when emitting
|
||
198 | * the RTSP PLAY command. If we are currently playing, this command is
|
||
199 | * called instantly. If we are currently paused, this command is called
|
||
200 | * whenever we resume playback. Either way, the value is only used once,
|
||
201 | * see rtsp_read_play() and rtsp_read_seek(). */
|
||
202 | 74272b1c | Ronald S. Bultje | int64_t seek_timestamp; |
203 | |||
204 | /* XXX: currently we use unbuffered input */
|
||
205 | // ByteIOContext rtsp_gb;
|
||
206 | 26d6b3e2 | Ronald S. Bultje | |
207 | int seq; /**< RTSP command sequence number */ |
||
208 | |||
209 | /** copy of RTSPMessageHeader->session_id, i.e. the server-provided session
|
||
210 | * identifier that the client should re-transmit in each RTSP command */
|
||
211 | 74272b1c | Ronald S. Bultje | char session_id[512]; |
212 | 26d6b3e2 | Ronald S. Bultje | |
213 | 30e79845 | Ronald S. Bultje | /** copy of RTSPMessageHeader->timeout, i.e. the time (in seconds) that
|
214 | * the server will go without traffic on the RTSP/TCP line before it
|
||
215 | * closes the connection. */
|
||
216 | int timeout;
|
||
217 | |||
218 | /** timestamp of the last RTSP command that we sent to the RTSP server.
|
||
219 | * This is used to calculate when to send dummy commands to keep the
|
||
220 | bf7e799c | Stefano Sabatini | * connection alive, in conjunction with timeout. */
|
221 | 30e79845 | Ronald S. Bultje | int64_t last_cmd_time; |
222 | |||
223 | 26d6b3e2 | Ronald S. Bultje | /** the negotiated data/packet transport protocol; e.g. RTP or RDT */
|
224 | 74272b1c | Ronald S. Bultje | enum RTSPTransport transport;
|
225 | 26d6b3e2 | Ronald S. Bultje | |
226 | /** the negotiated network layer transport protocol; e.g. TCP or UDP
|
||
227 | * uni-/multicast */
|
||
228 | 74272b1c | Ronald S. Bultje | enum RTSPLowerTransport lower_transport;
|
229 | 26d6b3e2 | Ronald S. Bultje | |
230 | /** brand of server that we're talking to; e.g. WMS, REAL or other.
|
||
231 | * Detected based on the value of RTSPMessageHeader->server or the presence
|
||
232 | * of RTSPMessageHeader->real_challenge */
|
||
233 | 74272b1c | Ronald S. Bultje | enum RTSPServerType server_type;
|
234 | 26d6b3e2 | Ronald S. Bultje | |
235 | f9337897 | Ronald S. Bultje | /** base64-encoded authorization lines (username:password) */
|
236 | char *auth_b64;
|
||
237 | |||
238 | 26d6b3e2 | Ronald S. Bultje | /** The last reply of the server to a RTSP command */
|
239 | 74272b1c | Ronald S. Bultje | char last_reply[2048]; /* XXX: allocate ? */ |
240 | 26d6b3e2 | Ronald S. Bultje | |
241 | /** RTSPStream->transport_priv of the last stream that we read a
|
||
242 | * packet from */
|
||
243 | 0a861b6f | Ronald S. Bultje | void *cur_transport_priv;
|
244 | 26d6b3e2 | Ronald S. Bultje | |
245 | /** The following are used for Real stream selection */
|
||
246 | //@{
|
||
247 | /** whether we need to send a "SET_PARAMETER Subscribe:" command */
|
||
248 | 74272b1c | Ronald S. Bultje | int need_subscription;
|
249 | 26d6b3e2 | Ronald S. Bultje | |
250 | /** stream setup during the last frame read. This is used to detect if
|
||
251 | * we need to subscribe or unsubscribe to any new streams. */
|
||
252 | 74272b1c | Ronald S. Bultje | enum AVDiscard real_setup_cache[MAX_STREAMS];
|
253 | 26d6b3e2 | Ronald S. Bultje | |
254 | /** the last value of the "SET_PARAMETER Subscribe:" RTSP command.
|
||
255 | * this is used to send the same "Unsubscribe:" if stream setup changed,
|
||
256 | * before sending a new "Subscribe:" command. */
|
||
257 | 74272b1c | Ronald S. Bultje | char last_subscription[1024]; |
258 | 26d6b3e2 | Ronald S. Bultje | //@}
|
259 | 1a30d541 | Ronald S. Bultje | |
260 | /** The following are used for RTP/ASF streams */
|
||
261 | //@{
|
||
262 | /** ASF demuxer context for the embedded ASF stream from WMS servers */
|
||
263 | AVFormatContext *asf_ctx; |
||
264 | c2f3eec4 | Ronald S. Bultje | |
265 | /** cache for position of the asf demuxer, since we load a new
|
||
266 | * data packet in the bytecontext for each incoming RTSP packet. */
|
||
267 | uint64_t asf_pb_pos; |
||
268 | 1a30d541 | Ronald S. Bultje | //@}
|
269 | 00eb13e0 | Alan Steremberg | |
270 | /** some MS RTSP streams contain a URL in the SDP that we need to use
|
||
271 | * for all subsequent RTSP requests, rather than the input URI; in
|
||
272 | * other cases, this is a copy of AVFormatContext->filename. */
|
||
273 | char control_uri[1024]; |
||
274 | c07c6f81 | Martin Storsjö | |
275 | /** The synchronized start time of the output streams. */
|
||
276 | int64_t start_time; |
||
277 | 74272b1c | Ronald S. Bultje | } RTSPState; |
278 | |||
279 | 26d6b3e2 | Ronald S. Bultje | /**
|
280 | * Describes a single stream, as identified by a single m= line block in the
|
||
281 | * SDP content. In the case of RDT, one RTSPStream can represent multiple
|
||
282 | * AVStreams. In this case, each AVStream in this set has similar content
|
||
283 | * (but different codec/bitrate).
|
||
284 | */
|
||
285 | 74272b1c | Ronald S. Bultje | typedef struct RTSPStream { |
286 | 26d6b3e2 | Ronald S. Bultje | URLContext *rtp_handle; /**< RTP stream handle (if UDP) */
|
287 | fd450a51 | Martin Storsjö | void *transport_priv; /**< RTP/RDT parse context if input, RTP AVFormatContext if output */ |
288 | 26d6b3e2 | Ronald S. Bultje | |
289 | /** corresponding stream index, if any. -1 if none (MPEG2TS case) */
|
||
290 | int stream_index;
|
||
291 | |||
292 | /** interleave IDs; copies of RTSPTransportField->interleaved_min/max
|
||
293 | * for the selected transport. Only used for TCP. */
|
||
294 | int interleaved_min, interleaved_max;
|
||
295 | |||
296 | char control_url[1024]; /**< url for this stream (from SDP) */ |
||
297 | |||
298 | /** The following are used only in SDP, not RTSP */
|
||
299 | //@{
|
||
300 | int sdp_port; /**< port (from SDP content) */ |
||
301 | struct in_addr sdp_ip; /**< IP address (from SDP content) */ |
||
302 | int sdp_ttl; /**< IP Time-To-Live (from SDP content) */ |
||
303 | int sdp_payload_type; /**< payload type */ |
||
304 | //@}
|
||
305 | 74272b1c | Ronald S. Bultje | |
306 | 26d6b3e2 | Ronald S. Bultje | /** rtp payload parsing infos from SDP (i.e. mapping between private
|
307 | * payload IDs and media-types (string), so that we can derive what
|
||
308 | * type of payload we're dealing with (and how to parse it). */
|
||
309 | RTPPayloadData rtp_payload_data; |
||
310 | 74272b1c | Ronald S. Bultje | |
311 | 26d6b3e2 | Ronald S. Bultje | /** The following are used for dynamic protocols (rtp_*.c/rdt.c) */
|
312 | //@{
|
||
313 | /** handler structure */
|
||
314 | RTPDynamicProtocolHandler *dynamic_handler; |
||
315 | 74272b1c | Ronald S. Bultje | |
316 | 26d6b3e2 | Ronald S. Bultje | /** private data associated with the dynamic protocol */
|
317 | PayloadContext *dynamic_protocol_context; |
||
318 | //@}
|
||
319 | 74272b1c | Ronald S. Bultje | } RTSPStream; |
320 | |||
321 | 3307e6ea | Ronald S. Bultje | void ff_rtsp_parse_line(RTSPMessageHeader *reply, const char *buf); |
322 | 1617ad97 | Fabrice Bellard | |
323 | c482500f | Ronald S. Bultje | #if LIBAVFORMAT_VERSION_INT < (53 << 16) |
324 | 1617ad97 | Fabrice Bellard | extern int rtsp_default_protocols; |
325 | c482500f | Ronald S. Bultje | #endif
|
326 | 85fb7b34 | Fabrice Bellard | extern int rtsp_rtp_port_min; |
327 | extern int rtsp_rtp_port_max; |
||
328 | b7b8fc34 | Fabrice Bellard | |
329 | 15ba2315 | Martin Storsjö | /**
|
330 | * Send a command to the RTSP server without waiting for the reply.
|
||
331 | *
|
||
332 | * @param s RTSP (de)muxer context
|
||
333 | * @param cmd the full first line of the request
|
||
334 | * @param send_content if non-null, the data to send as request body content
|
||
335 | * @param send_content_length the length of the send_content data, or 0 if
|
||
336 | * send_content is null
|
||
337 | */
|
||
338 | 3307e6ea | Ronald S. Bultje | void ff_rtsp_send_cmd_with_content_async(AVFormatContext *s,
|
339 | 93993933 | Martin Storsjö | const char *cmd, |
340 | const unsigned char *send_content, |
||
341 | int send_content_length);
|
||
342 | 15ba2315 | Martin Storsjö | /**
|
343 | * Send a command to the RTSP server without waiting for the reply.
|
||
344 | *
|
||
345 | * @see rtsp_send_cmd_with_content_async
|
||
346 | */
|
||
347 | 3307e6ea | Ronald S. Bultje | void ff_rtsp_send_cmd_async(AVFormatContext *s, const char *cmd); |
348 | 15ba2315 | Martin Storsjö | |
349 | /**
|
||
350 | * Send a command to the RTSP server and wait for the reply.
|
||
351 | *
|
||
352 | * @param s RTSP (de)muxer context
|
||
353 | * @param cmd the full first line of the request
|
||
354 | * @param reply pointer where the RTSP message header will be stored
|
||
355 | * @param content_ptr pointer where the RTSP message body, if any, will
|
||
356 | * be stored (length is in reply)
|
||
357 | * @param send_content if non-null, the data to send as request body content
|
||
358 | * @param send_content_length the length of the send_content data, or 0 if
|
||
359 | * send_content is null
|
||
360 | */
|
||
361 | 3307e6ea | Ronald S. Bultje | void ff_rtsp_send_cmd_with_content(AVFormatContext *s,
|
362 | 93993933 | Martin Storsjö | const char *cmd, |
363 | RTSPMessageHeader *reply, |
||
364 | unsigned char **content_ptr, |
||
365 | const unsigned char *send_content, |
||
366 | int send_content_length);
|
||
367 | 15ba2315 | Martin Storsjö | |
368 | /**
|
||
369 | * Send a command to the RTSP server and wait for the reply.
|
||
370 | *
|
||
371 | * @see rtsp_send_cmd_with_content
|
||
372 | */
|
||
373 | 3307e6ea | Ronald S. Bultje | void ff_rtsp_send_cmd(AVFormatContext *s, const char *cmd, |
374 | 93993933 | Martin Storsjö | RTSPMessageHeader *reply, unsigned char **content_ptr); |
375 | 15ba2315 | Martin Storsjö | |
376 | /**
|
||
377 | * Read a RTSP message from the server, or prepare to read data
|
||
378 | * packets if we're reading data interleaved over the TCP/RTSP
|
||
379 | * connection as well.
|
||
380 | *
|
||
381 | * @param s RTSP (de)muxer context
|
||
382 | * @param reply pointer where the RTSP message header will be stored
|
||
383 | * @param content_ptr pointer where the RTSP message body, if any, will
|
||
384 | * be stored (length is in reply)
|
||
385 | * @param return_on_interleaved_data whether the function may return if we
|
||
386 | * encounter a data marker ('$'), which precedes data
|
||
387 | * packets over interleaved TCP/RTSP connections. If this
|
||
388 | * is set, this function will return 1 after encountering
|
||
389 | * a '$'. If it is not set, the function will skip any
|
||
390 | * data packets (if they are encountered), until a reply
|
||
391 | * has been fully parsed. If no more data is available
|
||
392 | * without parsing a reply, it will return an error.
|
||
393 | *
|
||
394 | * @returns 1 if a data packets is ready to be received, -1 on error,
|
||
395 | * and 0 on success.
|
||
396 | */
|
||
397 | 3307e6ea | Ronald S. Bultje | int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply,
|
398 | 93993933 | Martin Storsjö | unsigned char **content_ptr, |
399 | int return_on_interleaved_data);
|
||
400 | 15ba2315 | Martin Storsjö | |
401 | /**
|
||
402 | * Connect to the RTSP server and set up the individual media streams.
|
||
403 | * This can be used for both muxers and demuxers.
|
||
404 | *
|
||
405 | * @param s RTSP (de)muxer context
|
||
406 | *
|
||
407 | * @returns 0 on success, < 0 on error. Cleans up all allocations done
|
||
408 | * within the function on error.
|
||
409 | */
|
||
410 | 3307e6ea | Ronald S. Bultje | int ff_rtsp_connect(AVFormatContext *s);
|
411 | 15ba2315 | Martin Storsjö | |
412 | /**
|
||
413 | * Close and free all streams within the RTSP (de)muxer
|
||
414 | *
|
||
415 | * @param s RTSP (de)muxer context
|
||
416 | */
|
||
417 | 3307e6ea | Ronald S. Bultje | void ff_rtsp_close_streams(AVFormatContext *s);
|
418 | 15ba2315 | Martin Storsjö | |
419 | 58ad770f | Stefano Sabatini | #endif /* AVFORMAT_RTSP_H */ |