83 if (rbuf[idx] ==
'\r') {
85 }
else if (rbuf[idx] ==
'\n') {
91 }
while (idx < rbufsize);
97 const char *extracontent, uint16_t seq)
104 snprintf(message,
sizeof(message),
"RTSP/1.0 %d %s\r\n",
112 av_strlcatf(message,
sizeof(message),
"CSeq: %d\r\n", seq);
115 av_strlcat(message, extracontent,
sizeof(message));
128 if (!session_id[0]) {
132 if (strcmp(session_id, request->
session_id)) {
149 ret =
read_line(s, rbuf,
sizeof(rbuf), &rbuflen);
156 }
while (rbuflen > 0);
157 if (request->
seq != rt->
seq + 1) {
162 if (rt->
session_id[0] && strcmp(method,
"OPTIONS")) {
193 "Unable to get complete SDP Description in ANNOUNCE\n");
206 "Content-Length header value exceeds sdp allocated buffer (4KB)\n");
208 "Content-Length exceeds buffer size", request.
seq);
225 "Public: ANNOUNCE, PAUSE, SETUP, TEARDOWN, RECORD\r\n",
237 char responseheaders[1024];
239 int transportidx = 0;
258 " protocol not supported (yet)\n");
264 "using first of all\n");
285 snprintf(responseheaders,
sizeof(responseheaders),
"Transport: "
286 "RTP/AVP/TCP;unicast;mode=receive;interleaved=%d-%d"
317 snprintf(responseheaders,
sizeof(responseheaders),
"Transport: "
318 "RTP/AVP/UDP;unicast;mode=receive;source=%s;"
319 "client_port=%d-%d;server_port=%d-%d\r\n",
331 av_strlcatf(responseheaders,
sizeof(responseheaders),
"Session: %s\r\n",
345 char responseheaders[1024];
354 snprintf(responseheaders,
sizeof(responseheaders),
"Session: %s\r\n",
363 int linelen,
char *uri,
int urisize,
364 char *method,
int methodsize,
368 const char *linept, *searchlinept;
369 linept = strchr(line,
' ');
376 if (linept - line > methodsize - 1) {
380 memcpy(method, line, linept - line);
381 method[linept - line] =
'\0';
383 if (!strcmp(method,
"ANNOUNCE"))
385 else if (!strcmp(method,
"OPTIONS"))
387 else if (!strcmp(method,
"RECORD"))
389 else if (!strcmp(method,
"SETUP"))
391 else if (!strcmp(method,
"PAUSE"))
393 else if (!strcmp(method,
"TEARDOWN"))
406 && (*methodcode !=
SETUP)) {
423 searchlinept = strchr(linept,
' ');
428 if (searchlinept - linept > urisize - 1) {
432 memcpy(uri, linept, searchlinept - linept);
433 uri[searchlinept - linept] =
'\0';
435 char host[128], path[512], auth[128];
437 char ctl_host[128], ctl_path[512], ctl_auth[128];
440 path,
sizeof(path), uri);
442 sizeof(ctl_host), &ctl_port, ctl_path,
sizeof(ctl_path),
444 if (strcmp(host, ctl_host))
447 if (strcmp(path, ctl_path) && *methodcode !=
SETUP)
449 " %s\n", path, ctl_path);
452 "Updating control URI to %s\n", uri);
457 linept = searchlinept + 1;
468 unsigned char rbuf[4096];
469 unsigned char method[10];
476 ret =
read_line(s, rbuf,
sizeof(rbuf), &rbuflen);
480 sizeof(method), &methodcode);
490 if (methodcode ==
PAUSE) {
494 }
else if (methodcode ==
OPTIONS) {
496 "Public: ANNOUNCE, PAUSE, SETUP, TEARDOWN, "
497 "RECORD\r\n", request.
seq);
498 }
else if (methodcode ==
TEARDOWN) {
547 "Range: npt=%"PRId64
".%03"PRId64
"-\r\n",
597 unsigned char *content =
NULL;
602 "Accept: application/sdp\r\n");
609 "Require: com.real.retain-entity-for-setup\r\n",
633 char proto[128], host[128], path[512], auth[128];
638 const char *lower_proto =
"tcp";
639 unsigned char rbuf[4096];
640 unsigned char method[10];
646 av_url_split(proto,
sizeof(proto), auth,
sizeof(auth), host,
sizeof(host),
647 &port, path,
sizeof(path), s->
url);
653 if (!strcmp(proto,
"rtsps")) {
674 ret =
read_line(s, rbuf,
sizeof(rbuf), &rbuflen);
678 sizeof(method), &methodcode);
687 }
else if (methodcode ==
OPTIONS) {
689 }
else if (methodcode ==
RECORD) {
693 }
else if (methodcode ==
SETUP)
705 #
if CONFIG_TLS_PROTOCOL
777 if (len > buf_size || len < 8)
791 id <= rtsp_st->interleaved_max)
831 "Unsubscribe: %s\r\n",
842 int r, rule_nr, first = 1;
929 int64_t timestamp,
int flags)
974 .priv_class = &rtsp_demuxer_class,
int interleaved_min
interleave ids, if TCP transport; each TCP/RTSP data packet starts with a '$', stream length and stre...
void av_url_split(char *proto, int proto_size, char *authorization, int authorization_size, char *hostname, int hostname_size, int *port_ptr, char *path, int path_size, const char *url)
Split a URL string into components.
int rtp_port_min
Minimum and maximum local UDP ports.
Realmedia Data Transport.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static int rtsp_read_options(AVFormatContext *s)
int ff_rtp_get_local_rtp_port(URLContext *h)
Return the local rtp port used by the RTP connection.
int ffurl_open_whitelist(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options, const char *whitelist, const char *blacklist, URLContext *parent)
Create an URLContext for accessing to the resource indicated by url, and open it. ...
void ff_rtp_send_punch_packets(URLContext *rtp_handle)
Send a dummy packet on both port pairs to set up the connection state in potential NAT routers...
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
static const struct RTSPStatusMessage status_messages[]
static int rtsp_read_request(AVFormatContext *s, RTSPMessageHeader *request, const char *method)
static int rtsp_read_close(AVFormatContext *s)
#define AV_LOG_WARNING
Something somehow does not look correct.
#define LIBAVUTIL_VERSION_INT
char control_uri[1024]
some MS RTSP streams contain a URL in the SDP that we need to use for all subsequent RTSP requests...
static int rtsp_read_header(AVFormatContext *s)
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
#define RTSP_DEFAULT_PORT
int64_t range_start_offset
int ff_rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st)
Open RTSP transport context.
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
static int rtsp_probe(AVProbeData *p)
const char * av_default_item_name(void *ptr)
Return the context name.
enum AVDiscard * real_setup
current stream setup.
static int resetup_tcp(AVFormatContext *s)
enum AVDiscard * real_setup_cache
stream setup during the last frame read.
int mode_record
transport set to record data
int ff_rtsp_setup_input_streams(AVFormatContext *s, RTSPMessageHeader *reply)
Get the description of the stream and set up the RTSPStream child objects.
void ff_network_close(void)
initialized and sending/receiving data
char real_challenge[64]
the "RealChallenge1:" field from the server
static int rtsp_read_pause(AVFormatContext *s)
int ff_rtsp_tcp_read_packet(AVFormatContext *s, RTSPStream **prtsp_st, uint8_t *buf, int buf_size)
Receive one RTP packet from an TCP interleaved RTSP stream.
uint64_t last_rtcp_ntp_time
void ff_rdt_subscribe_rule(char *cmd, int size, int stream_nr, int rule_nr)
Add subscription information to Subscribe parameter string.
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_WB32 unsigned int_TMPL AV_WB24 unsigned int_TMPL AV_RB16
#define RTSP_FLAG_LISTEN
Wait for incoming connections.
char session_id[512]
copy of RTSPMessageHeader->session_id, i.e.
int64_t seek_timestamp
the seek value requested when calling av_seek_frame().
static int rtsp_send_reply(AVFormatContext *s, enum RTSPStatusCode code, const char *extracontent, uint16_t seq)
static int check_sessionid(AVFormatContext *s, RTSPMessageHeader *request)
int ff_rtsp_make_setup_request(AVFormatContext *s, const char *host, int port, int lower_transport, const char *real_challenge)
Do the SETUP requests for each stream for the chosen lower transport mode.
enum RTSPLowerTransport lower_transport
network layer transport protocol; e.g.
int ff_rtsp_connect(AVFormatContext *s)
Connect to the RTSP server and set up the individual media streams.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
uint64_t first_rtcp_ntp_time
static int rtsp_read_packet(AVFormatContext *s, AVPacket *pkt)
int get_parameter_supported
Whether the server supports the GET_PARAMETER method.
miscellaneous OS support macros and functions.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
int id
Format-specific stream ID.
int initial_timeout
Timeout to wait for incoming connections.
static int read_line(AVFormatContext *s, char *rbuf, const int rbufsize, int *rbuflen)
AVStream ** streams
A list of all streams in the file.
URLContext * rtsp_hd_out
Additional output handle, used when input and output are done separately, eg for HTTP tunneling...
static int rtsp_read_setup(AVFormatContext *s, char *host, char *controlurl)
#define AVERROR_PROTOCOL_NOT_FOUND
Protocol not found.
Describe a single stream, as identified by a single m= line block in the SDP content.
char * protocol_whitelist
',' separated list of allowed protocols.
#define AVERROR_EOF
End of file.
static av_cold int read_close(AVFormatContext *ctx)
#define AV_LOG_VERBOSE
Detailed information.
int ff_rtsp_send_cmd(AVFormatContext *s, const char *method, const char *url, const char *headers, RTSPMessageHeader *reply, unsigned char **content_ptr)
Send a command to the RTSP server and wait for the reply.
static int rtsp_read_play(AVFormatContext *s)
static int ff_rtsp_averror(enum RTSPStatusCode status_code, int default_averror)
void ff_rtsp_parse_line(AVFormatContext *s, RTSPMessageHeader *reply, const char *buf, RTSPState *rt, const char *method)
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
int ff_sdp_parse(AVFormatContext *s, const char *content)
Parse an SDP description of streams by populating an RTSPState struct within the AVFormatContext; als...
int ff_rtsp_parse_streaming_commands(AVFormatContext *s)
Parse RTSP commands (OPTIONS, PAUSE and TEARDOWN) during streaming in listen mode.
Private data for the RTSP demuxer.
int64_t last_cmd_time
timestamp of the last RTSP command that we sent to the RTSP server.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
int timeout
copy of RTSPMessageHeader->timeout, i.e.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
char * url
input or output URL.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
const AVOption ff_rtsp_options[]
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
static int parse_command_line(AVFormatContext *s, const char *line, int linelen, char *uri, int urisize, char *method, int methodsize, enum RTSPMethod *methodcode)
struct RTSPStream ** rtsp_streams
streams in this session
static int rtsp_read_record(AVFormatContext *s)
int stream_index
corresponding stream index, if any.
int seq
RTSP command sequence number.
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
int nb_rtsp_streams
number of items in the 'rtsp_streams' variable
#define AV_TIME_BASE
Internal time base represented as integer.
char last_subscription[1024]
the last value of the "SET_PARAMETER Subscribe:" RTSP command.
int stale
Auth ok, but needs to be resent with a new nonce.
int ff_rdt_parse_header(const uint8_t *buf, int len, int *pset_id, int *pseq_no, int *pstream_id, int *pis_keyframe, uint32_t *ptimestamp)
Actual data handling.
static int read_header(FFV1Context *f)
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
enum RTSPLowerTransport lower_transport
the negotiated network layer transport protocol; e.g.
#define AV_LOG_INFO
Standard information.
void ff_rtsp_undo_setup(AVFormatContext *s, int send_packets)
Undo the effect of ff_rtsp_make_setup_request, close the transport_priv and rtp_handle fields...
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
int64_t unwrapped_timestamp
enum RTSPTransport transport
the negotiated data/packet transport protocol; e.g.
#define RTSPS_DEFAULT_PORT
#define AVIO_FLAG_READ_WRITE
read-write pseudo flag
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
int rtsp_flags
Various option flags for the RTSP muxer/demuxer.
Describe the class of an AVClass context structure.
AVInputFormat ff_rtsp_demuxer
static int rtsp_listen(AVFormatContext *s)
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
void ff_rtsp_close_streams(AVFormatContext *s)
Close and free all streams within the RTSP (de)muxer.
This structure contains the data a format has to probe a file.
size_t av_strlcat(char *dst, const char *src, size_t size)
Append the string src to the string dst, but to a total length of no more than size - 1 bytes...
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
enum RTSPServerType server_type
brand of server that we're talking to; e.g.
int ffurl_close(URLContext *h)
RTSPStatusCode
RTSP handling.
enum RTSPClientState state
indicator of whether we are currently receiving data from the server.
int ff_rtsp_fetch_packet(AVFormatContext *s, AVPacket *pkt)
Receive one packet from the RTSPStreams set up in the AVFormatContext (which should contain a RTSPSta...
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
static const AVClass rtsp_demuxer_class
initialized, requesting a seek
int need_subscription
The following are used for Real stream selection.
int ffurl_read_complete(URLContext *h, unsigned char *buf, int size)
Read as many bytes as possible (up to size), calling the read function multiple times if necessary...
static int rtsp_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
initialized, but not receiving data
int ff_rtsp_read_reply(AVFormatContext *s, RTSPMessageHeader *reply, unsigned char **content_ptr, int return_on_interleaved_data, const char *method)
Read a RTSP message from the server, or prepare to read data packets if we're reading data interleave...
int ff_rtsp_send_cmd_async(AVFormatContext *s, const char *method, const char *url, const char *headers)
Send a command to the RTSP server without waiting for the reply.
#define AVERROR_OPTION_NOT_FOUND
Option not found.
TCP; interleaved in RTSP.
HTTPAuthState auth_state
authentication state
char control_url[1024]
url for this stream (from SDP)
void * priv_data
Format private data.
#define AVERROR_STREAM_NOT_FOUND
Stream not found.
uint64_t packets
The number of returned packets.
char * protocol_blacklist
',' separated list of disallowed protocols.
int lower_transport_mask
A mask with all requested transport methods.
static int rtsp_read_announce(AVFormatContext *s)
unbuffered private I/O API
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
enum AVDiscard discard
Selects which packets can be discarded at will and do not need to be demuxed.
int interleaved_min
interleave IDs; copies of RTSPTransportField->interleaved_min/max for the selected transport...
This structure stores compressed data.
void ff_rtsp_close_connections(AVFormatContext *s)
Close all connection handles within the RTSP (de)muxer.
URLContext * rtp_handle
RTP stream handle (if UDP)
#define AV_NOPTS_VALUE
Undefined timestamp value.
void * transport_priv
RTP/RDT parse context if input, RTP AVFormatContext if output.
int client_port_min
UDP client ports; these should be the local ports of the UDP RTP (and RTCP) sockets over which we rec...
void * av_mallocz_array(size_t nmemb, size_t size)
int initial_pause
Do not begin to play the stream immediately.