FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavformat
rtsp.h
Go to the documentation of this file.
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 AVFORMAT_RTSP_H
22
#define AVFORMAT_RTSP_H
23
24
#include <stdint.h>
25
#include "
avformat.h
"
26
#include "
rtspcodes.h
"
27
#include "
rtpdec.h
"
28
#include "
network.h
"
29
#include "
httpauth.h
"
30
31
#include "
libavutil/log.h
"
32
#include "
libavutil/opt.h
"
33
34
/**
35
* Network layer over which RTP/etc packet data will be transported.
36
*/
37
enum
RTSPLowerTransport
{
38
RTSP_LOWER_TRANSPORT_UDP
= 0,
/**< UDP/unicast */
39
RTSP_LOWER_TRANSPORT_TCP
= 1,
/**< TCP; interleaved in RTSP */
40
RTSP_LOWER_TRANSPORT_UDP_MULTICAST
= 2,
/**< UDP/multicast */
41
RTSP_LOWER_TRANSPORT_NB
,
42
RTSP_LOWER_TRANSPORT_HTTP
= 8,
/**< HTTP tunneled - not a proper
43
transport mode as such,
44
only for use via AVOptions */
45
RTSP_LOWER_TRANSPORT_CUSTOM
= 16,
/**< Custom IO - not a public
46
option for lower_transport_mask,
47
but set in the SDP demuxer based
48
on a flag. */
49
};
50
51
/**
52
* Packet profile of the data that we will be receiving. Real servers
53
* commonly send RDT (although they can sometimes send RTP as well),
54
* whereas most others will send RTP.
55
*/
56
enum
RTSPTransport
{
57
RTSP_TRANSPORT_RTP
,
/**< Standards-compliant RTP */
58
RTSP_TRANSPORT_RDT
,
/**< Realmedia Data Transport */
59
RTSP_TRANSPORT_RAW
,
/**< Raw data (over UDP) */
60
RTSP_TRANSPORT_NB
61
};
62
63
/**
64
* Transport mode for the RTSP data. This may be plain, or
65
* tunneled, which is done over HTTP.
66
*/
67
enum
RTSPControlTransport
{
68
RTSP_MODE_PLAIN
,
/**< Normal RTSP */
69
RTSP_MODE_TUNNEL
/**< RTSP over HTTP (tunneling) */
70
};
71
72
#define RTSP_DEFAULT_PORT 554
73
#define RTSP_MAX_TRANSPORTS 8
74
#define RTSP_TCP_MAX_PACKET_SIZE 1472
75
#define RTSP_DEFAULT_NB_AUDIO_CHANNELS 1
76
#define RTSP_DEFAULT_AUDIO_SAMPLERATE 44100
77
#define RTSP_RTP_PORT_MIN 5000
78
#define RTSP_RTP_PORT_MAX 65000
79
80
/**
81
* This describes a single item in the "Transport:" line of one stream as
82
* negotiated by the SETUP RTSP command. Multiple transports are comma-
83
* separated ("Transport: x-read-rdt/tcp;interleaved=0-1,rtp/avp/udp;
84
* client_port=1000-1001;server_port=1800-1801") and described in separate
85
* RTSPTransportFields.
86
*/
87
typedef
struct
RTSPTransportField
{
88
/** interleave ids, if TCP transport; each TCP/RTSP data packet starts
89
* with a '$', stream length and stream ID. If the stream ID is within
90
* the range of this interleaved_min-max, then the packet belongs to
91
* this stream. */
92
int
interleaved_min
,
interleaved_max
;
93
94
/** UDP multicast port range; the ports to which we should connect to
95
* receive multicast UDP data. */
96
int
port_min
,
port_max
;
97
98
/** UDP client ports; these should be the local ports of the UDP RTP
99
* (and RTCP) sockets over which we receive RTP/RTCP data. */
100
int
client_port_min
,
client_port_max
;
101
102
/** UDP unicast server port range; the ports to which we should connect
103
* to receive unicast UDP RTP/RTCP data. */
104
int
server_port_min
,
server_port_max
;
105
106
/** time-to-live value (required for multicast); the amount of HOPs that
107
* packets will be allowed to make before being discarded. */
108
int
ttl
;
109
110
/** transport set to record data */
111
int
mode_record
;
112
113
struct
sockaddr_storage
destination
;
/**< destination IP address */
114
char
source
[
INET6_ADDRSTRLEN
+ 1];
/**< source IP address */
115
116
/** data/packet transport protocol; e.g. RTP or RDT */
117
enum
RTSPTransport
transport
;
118
119
/** network layer transport protocol; e.g. TCP or UDP uni-/multicast */
120
enum
RTSPLowerTransport
lower_transport
;
121
}
RTSPTransportField
;
122
123
/**
124
* This describes the server response to each RTSP command.
125
*/
126
typedef
struct
RTSPMessageHeader
{
127
/** length of the data following this header */
128
int
content_length
;
129
130
enum
RTSPStatusCode
status_code
;
/**< response code from server */
131
132
/** number of items in the 'transports' variable below */
133
int
nb_transports
;
134
135
/** Time range of the streams that the server will stream. In
136
* AV_TIME_BASE unit, AV_NOPTS_VALUE if not used */
137
int64_t
range_start
,
range_end
;
138
139
/** describes the complete "Transport:" line of the server in response
140
* to a SETUP RTSP command by the client */
141
RTSPTransportField
transports
[
RTSP_MAX_TRANSPORTS
];
142
143
int
seq
;
/**< sequence number */
144
145
/** the "Session:" field. This value is initially set by the server and
146
* should be re-transmitted by the client in every RTSP command. */
147
char
session_id
[512];
148
149
/** the "Location:" field. This value is used to handle redirection.
150
*/
151
char
location
[4096];
152
153
/** the "RealChallenge1:" field from the server */
154
char
real_challenge
[64];
155
156
/** the "Server: field, which can be used to identify some special-case
157
* servers that are not 100% standards-compliant. We use this to identify
158
* Windows Media Server, which has a value "WMServer/v.e.r.sion", where
159
* version is a sequence of digits (e.g. 9.0.0.3372). Helix/Real servers
160
* use something like "Helix [..] Server Version v.e.r.sion (platform)
161
* (RealServer compatible)" or "RealServer Version v.e.r.sion (platform)",
162
* where platform is the output of $uname -msr | sed 's/ /-/g'. */
163
char
server
[64];
164
165
/** The "timeout" comes as part of the server response to the "SETUP"
166
* command, in the "Session: <xyz>[;timeout=<value>]" line. It is the
167
* time, in seconds, that the server will go without traffic over the
168
* RTSP/TCP connection before it closes the connection. To prevent
169
* this, sent dummy requests (e.g. OPTIONS) with intervals smaller
170
* than this value. */
171
int
timeout
;
172
173
/** The "Notice" or "X-Notice" field value. See
174
* http://tools.ietf.org/html/draft-stiemerling-rtsp-announce-00
175
* for a complete list of supported values. */
176
int
notice
;
177
178
/** The "reason" is meant to specify better the meaning of the error code
179
* returned
180
*/
181
char
reason
[256];
182
183
/**
184
* Content type header
185
*/
186
char
content_type
[64];
187
}
RTSPMessageHeader
;
188
189
/**
190
* Client state, i.e. whether we are currently receiving data (PLAYING) or
191
* setup-but-not-receiving (PAUSED). State can be changed in applications
192
* by calling av_read_play/pause().
193
*/
194
enum
RTSPClientState
{
195
RTSP_STATE_IDLE
,
/**< not initialized */
196
RTSP_STATE_STREAMING
,
/**< initialized and sending/receiving data */
197
RTSP_STATE_PAUSED
,
/**< initialized, but not receiving data */
198
RTSP_STATE_SEEKING
,
/**< initialized, requesting a seek */
199
};
200
201
/**
202
* Identify particular servers that require special handling, such as
203
* standards-incompliant "Transport:" lines in the SETUP request.
204
*/
205
enum
RTSPServerType
{
206
RTSP_SERVER_RTP
,
/**< Standards-compliant RTP-server */
207
RTSP_SERVER_REAL
,
/**< Realmedia-style server */
208
RTSP_SERVER_WMS
,
/**< Windows Media server */
209
RTSP_SERVER_NB
210
};
211
212
/**
213
* Private data for the RTSP demuxer.
214
*
215
* @todo Use AVIOContext instead of URLContext
216
*/
217
typedef
struct
RTSPState
{
218
const
AVClass
*
class
;
/**< Class for private options. */
219
URLContext
*
rtsp_hd
;
/* RTSP TCP connection handle */
220
221
/** number of items in the 'rtsp_streams' variable */
222
int
nb_rtsp_streams
;
223
224
struct
RTSPStream
**
rtsp_streams
;
/**< streams in this session */
225
226
/** indicator of whether we are currently receiving data from the
227
* server. Basically this isn't more than a simple cache of the
228
* last PLAY/PAUSE command sent to the server, to make sure we don't
229
* send 2x the same unexpectedly or commands in the wrong state. */
230
enum
RTSPClientState
state
;
231
232
/** the seek value requested when calling av_seek_frame(). This value
233
* is subsequently used as part of the "Range" parameter when emitting
234
* the RTSP PLAY command. If we are currently playing, this command is
235
* called instantly. If we are currently paused, this command is called
236
* whenever we resume playback. Either way, the value is only used once,
237
* see rtsp_read_play() and rtsp_read_seek(). */
238
int64_t
seek_timestamp
;
239
240
int
seq
;
/**< RTSP command sequence number */
241
242
/** copy of RTSPMessageHeader->session_id, i.e. the server-provided session
243
* identifier that the client should re-transmit in each RTSP command */
244
char
session_id
[512];
245
246
/** copy of RTSPMessageHeader->timeout, i.e. the time (in seconds) that
247
* the server will go without traffic on the RTSP/TCP line before it
248
* closes the connection. */
249
int
timeout
;
250
251
/** timestamp of the last RTSP command that we sent to the RTSP server.
252
* This is used to calculate when to send dummy commands to keep the
253
* connection alive, in conjunction with timeout. */
254
int64_t
last_cmd_time
;
255
256
/** the negotiated data/packet transport protocol; e.g. RTP or RDT */
257
enum
RTSPTransport
transport
;
258
259
/** the negotiated network layer transport protocol; e.g. TCP or UDP
260
* uni-/multicast */
261
enum
RTSPLowerTransport
lower_transport
;
262
263
/** brand of server that we're talking to; e.g. WMS, REAL or other.
264
* Detected based on the value of RTSPMessageHeader->server or the presence
265
* of RTSPMessageHeader->real_challenge */
266
enum
RTSPServerType
server_type
;
267
268
/** the "RealChallenge1:" field from the server */
269
char
real_challenge
[64];
270
271
/** plaintext authorization line (username:password) */
272
char
auth
[128];
273
274
/** authentication state */
275
HTTPAuthState
auth_state
;
276
277
/** The last reply of the server to a RTSP command */
278
char
last_reply
[2048];
/* XXX: allocate ? */
279
280
/** RTSPStream->transport_priv of the last stream that we read a
281
* packet from */
282
void
*
cur_transport_priv
;
283
284
/** The following are used for Real stream selection */
285
//@{
286
/** whether we need to send a "SET_PARAMETER Subscribe:" command */
287
int
need_subscription
;
288
289
/** stream setup during the last frame read. This is used to detect if
290
* we need to subscribe or unsubscribe to any new streams. */
291
enum
AVDiscard
*
real_setup_cache
;
292
293
/** current stream setup. This is a temporary buffer used to compare
294
* current setup to previous frame setup. */
295
enum
AVDiscard
*
real_setup
;
296
297
/** the last value of the "SET_PARAMETER Subscribe:" RTSP command.
298
* this is used to send the same "Unsubscribe:" if stream setup changed,
299
* before sending a new "Subscribe:" command. */
300
char
last_subscription
[1024];
301
//@}
302
303
/** The following are used for RTP/ASF streams */
304
//@{
305
/** ASF demuxer context for the embedded ASF stream from WMS servers */
306
AVFormatContext
*
asf_ctx
;
307
308
/** cache for position of the asf demuxer, since we load a new
309
* data packet in the bytecontext for each incoming RTSP packet. */
310
uint64_t
asf_pb_pos
;
311
//@}
312
313
/** some MS RTSP streams contain a URL in the SDP that we need to use
314
* for all subsequent RTSP requests, rather than the input URI; in
315
* other cases, this is a copy of AVFormatContext->filename. */
316
char
control_uri
[1024];
317
318
/** The following are used for parsing raw mpegts in udp */
319
//@{
320
struct
MpegTSContext
*
ts
;
321
int
recvbuf_pos
;
322
int
recvbuf_len
;
323
//@}
324
325
/** Additional output handle, used when input and output are done
326
* separately, eg for HTTP tunneling. */
327
URLContext
*
rtsp_hd_out
;
328
329
/** RTSP transport mode, such as plain or tunneled. */
330
enum
RTSPControlTransport
control_transport
;
331
332
/* Number of RTCP BYE packets the RTSP session has received.
333
* An EOF is propagated back if nb_byes == nb_streams.
334
* This is reset after a seek. */
335
int
nb_byes
;
336
337
/** Reusable buffer for receiving packets */
338
uint8_t
*
recvbuf
;
339
340
/**
341
* A mask with all requested transport methods
342
*/
343
int
lower_transport_mask
;
344
345
/**
346
* The number of returned packets
347
*/
348
uint64_t
packets
;
349
350
/**
351
* Polling array for udp
352
*/
353
struct
pollfd *
p
;
354
355
/**
356
* Whether the server supports the GET_PARAMETER method.
357
*/
358
int
get_parameter_supported
;
359
360
/**
361
* Do not begin to play the stream immediately.
362
*/
363
int
initial_pause
;
364
365
/**
366
* Option flags for the chained RTP muxer.
367
*/
368
int
rtp_muxer_flags
;
369
370
/** Whether the server accepts the x-Dynamic-Rate header */
371
int
accept_dynamic_rate
;
372
373
/**
374
* Various option flags for the RTSP muxer/demuxer.
375
*/
376
int
rtsp_flags
;
377
378
/**
379
* Mask of all requested media types
380
*/
381
int
media_type_mask
;
382
383
/**
384
* Minimum and maximum local UDP ports.
385
*/
386
int
rtp_port_min
,
rtp_port_max
;
387
388
/**
389
* Timeout to wait for incoming connections.
390
*/
391
int
initial_timeout
;
392
393
/**
394
* Size of RTP packet reordering queue.
395
*/
396
int
reordering_queue_size
;
397
}
RTSPState
;
398
399
#define RTSP_FLAG_FILTER_SRC 0x1
/**< Filter incoming UDP packets -
400
receive packets only from the right
401
source address and port. */
402
#define RTSP_FLAG_LISTEN 0x2
/**< Wait for incoming connections. */
403
#define RTSP_FLAG_CUSTOM_IO 0x4
/**< Do all IO via the AVIOContext. */
404
405
/**
406
* Describe a single stream, as identified by a single m= line block in the
407
* SDP content. In the case of RDT, one RTSPStream can represent multiple
408
* AVStreams. In this case, each AVStream in this set has similar content
409
* (but different codec/bitrate).
410
*/
411
typedef
struct
RTSPStream
{
412
URLContext
*
rtp_handle
;
/**< RTP stream handle (if UDP) */
413
void
*
transport_priv
;
/**< RTP/RDT parse context if input, RTP AVFormatContext if output */
414
415
/** corresponding stream index, if any. -1 if none (MPEG2TS case) */
416
int
stream_index
;
417
418
/** interleave IDs; copies of RTSPTransportField->interleaved_min/max
419
* for the selected transport. Only used for TCP. */
420
int
interleaved_min
,
interleaved_max
;
421
422
char
control_url
[1024];
/**< url for this stream (from SDP) */
423
424
/** The following are used only in SDP, not RTSP */
425
//@{
426
int
sdp_port
;
/**< port (from SDP content) */
427
struct
sockaddr_storage
sdp_ip
;
/**< IP address (from SDP content) */
428
int
sdp_ttl
;
/**< IP Time-To-Live (from SDP content) */
429
int
sdp_payload_type
;
/**< payload type */
430
//@}
431
432
/** The following are used for dynamic protocols (rtpdec_*.c/rdt.c) */
433
//@{
434
/** handler structure */
435
RTPDynamicProtocolHandler
*
dynamic_handler
;
436
437
/** private data associated with the dynamic protocol */
438
PayloadContext
*
dynamic_protocol_context
;
439
//@}
440
}
RTSPStream
;
441
442
void
ff_rtsp_parse_line
(
RTSPMessageHeader
*reply,
const
char
*buf,
443
RTSPState
*rt,
const
char
*method);
444
445
/**
446
* Send a command to the RTSP server without waiting for the reply.
447
*
448
* @see rtsp_send_cmd_with_content_async
449
*/
450
int
ff_rtsp_send_cmd_async
(
AVFormatContext
*s,
const
char
*method,
451
const
char
*url,
const
char
*headers);
452
453
/**
454
* Send a command to the RTSP server and wait for the reply.
455
*
456
* @param s RTSP (de)muxer context
457
* @param method the method for the request
458
* @param url the target url for the request
459
* @param headers extra header lines to include in the request
460
* @param reply pointer where the RTSP message header will be stored
461
* @param content_ptr pointer where the RTSP message body, if any, will
462
* be stored (length is in reply)
463
* @param send_content if non-null, the data to send as request body content
464
* @param send_content_length the length of the send_content data, or 0 if
465
* send_content is null
466
*
467
* @return zero if success, nonzero otherwise
468
*/
469
int
ff_rtsp_send_cmd_with_content
(
AVFormatContext
*s,
470
const
char
*method,
const
char
*url,
471
const
char
*headers,
472
RTSPMessageHeader
*reply,
473
unsigned
char
**content_ptr,
474
const
unsigned
char
*send_content,
475
int
send_content_length);
476
477
/**
478
* Send a command to the RTSP server and wait for the reply.
479
*
480
* @see rtsp_send_cmd_with_content
481
*/
482
int
ff_rtsp_send_cmd
(
AVFormatContext
*s,
const
char
*method,
483
const
char
*url,
const
char
*headers,
484
RTSPMessageHeader
*reply,
unsigned
char
**content_ptr);
485
486
/**
487
* Read a RTSP message from the server, or prepare to read data
488
* packets if we're reading data interleaved over the TCP/RTSP
489
* connection as well.
490
*
491
* @param s RTSP (de)muxer context
492
* @param reply pointer where the RTSP message header will be stored
493
* @param content_ptr pointer where the RTSP message body, if any, will
494
* be stored (length is in reply)
495
* @param return_on_interleaved_data whether the function may return if we
496
* encounter a data marker ('$'), which precedes data
497
* packets over interleaved TCP/RTSP connections. If this
498
* is set, this function will return 1 after encountering
499
* a '$'. If it is not set, the function will skip any
500
* data packets (if they are encountered), until a reply
501
* has been fully parsed. If no more data is available
502
* without parsing a reply, it will return an error.
503
* @param method the RTSP method this is a reply to. This affects how
504
* some response headers are acted upon. May be NULL.
505
*
506
* @return 1 if a data packets is ready to be received, -1 on error,
507
* and 0 on success.
508
*/
509
int
ff_rtsp_read_reply
(
AVFormatContext
*s,
RTSPMessageHeader
*reply,
510
unsigned
char
**content_ptr,
511
int
return_on_interleaved_data,
const
char
*method);
512
513
/**
514
* Skip a RTP/TCP interleaved packet.
515
*/
516
void
ff_rtsp_skip_packet
(
AVFormatContext
*s);
517
518
/**
519
* Connect to the RTSP server and set up the individual media streams.
520
* This can be used for both muxers and demuxers.
521
*
522
* @param s RTSP (de)muxer context
523
*
524
* @return 0 on success, < 0 on error. Cleans up all allocations done
525
* within the function on error.
526
*/
527
int
ff_rtsp_connect
(
AVFormatContext
*s);
528
529
/**
530
* Close and free all streams within the RTSP (de)muxer
531
*
532
* @param s RTSP (de)muxer context
533
*/
534
void
ff_rtsp_close_streams
(
AVFormatContext
*s);
535
536
/**
537
* Close all connection handles within the RTSP (de)muxer
538
*
539
* @param s RTSP (de)muxer context
540
*/
541
void
ff_rtsp_close_connections
(
AVFormatContext
*s);
542
543
/**
544
* Get the description of the stream and set up the RTSPStream child
545
* objects.
546
*/
547
int
ff_rtsp_setup_input_streams
(
AVFormatContext
*s,
RTSPMessageHeader
*reply);
548
549
/**
550
* Announce the stream to the server and set up the RTSPStream child
551
* objects for each media stream.
552
*/
553
int
ff_rtsp_setup_output_streams
(
AVFormatContext
*s,
const
char
*addr);
554
555
/**
556
* Parse RTSP commands (OPTIONS, PAUSE and TEARDOWN) during streaming in
557
* listen mode.
558
*/
559
int
ff_rtsp_parse_streaming_commands
(
AVFormatContext
*s);
560
561
/**
562
* Parse an SDP description of streams by populating an RTSPState struct
563
* within the AVFormatContext; also allocate the RTP streams and the
564
* pollfd array used for UDP streams.
565
*/
566
int
ff_sdp_parse
(
AVFormatContext
*s,
const
char
*content);
567
568
/**
569
* Receive one RTP packet from an TCP interleaved RTSP stream.
570
*/
571
int
ff_rtsp_tcp_read_packet
(
AVFormatContext
*s,
RTSPStream
**prtsp_st,
572
uint8_t
*buf,
int
buf_size);
573
574
/**
575
* Receive one packet from the RTSPStreams set up in the AVFormatContext
576
* (which should contain a RTSPState struct as priv_data).
577
*/
578
int
ff_rtsp_fetch_packet
(
AVFormatContext
*s,
AVPacket
*
pkt
);
579
580
/**
581
* Do the SETUP requests for each stream for the chosen
582
* lower transport mode.
583
* @return 0 on success, <0 on error, 1 if protocol is unavailable
584
*/
585
int
ff_rtsp_make_setup_request
(
AVFormatContext
*s,
const
char
*host,
int
port,
586
int
lower_transport,
const
char
*real_challenge);
587
588
/**
589
* Undo the effect of ff_rtsp_make_setup_request, close the
590
* transport_priv and rtp_handle fields.
591
*/
592
void
ff_rtsp_undo_setup
(
AVFormatContext
*s);
593
594
/**
595
* Open RTSP transport context.
596
*/
597
int
ff_rtsp_open_transport_ctx
(
AVFormatContext
*s,
RTSPStream
*rtsp_st);
598
599
extern
const
AVOption
ff_rtsp_options
[];
600
601
#endif
/* AVFORMAT_RTSP_H */
Generated on Sat May 25 2013 03:58:49 for FFmpeg by
1.8.2