83 if (rbuf[idx] ==
'\r') {
85 }
else if (rbuf[idx] ==
'\n') {
91 }
while (idx < rbufsize);
97 const char *extracontent, uint16_t seq)
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",
239 int transportidx = 0;
258 " protocol not supported (yet)\n");
264 "using first of all\n");
296 snprintf(responseheaders,
sizeof(responseheaders),
"Transport: "
297 "RTP/AVP/TCP;unicast;mode=receive;interleaved=%d-%d"
307 &
s->interrupt_callback, &
opts,
308 s->protocol_whitelist,
s->protocol_blacklist,
NULL);
326 snprintf(responseheaders,
sizeof(responseheaders),
"Transport: "
327 "RTP/AVP/UDP;unicast;mode=receive;source=%s;"
328 "client_port=%d-%d;server_port=%d-%d\r\n",
340 av_strlcatf(responseheaders,
sizeof(responseheaders),
"Session: %s\r\n",
363 snprintf(responseheaders,
sizeof(responseheaders),
"Session: %s\r\n",
372 int linelen,
char *uri,
int urisize,
373 char *method,
int methodsize,
377 const char *linept, *searchlinept;
378 linept = strchr(
line,
' ');
385 if (linept -
line > methodsize - 1) {
389 memcpy(method,
line, linept -
line);
390 method[linept -
line] =
'\0';
392 if (!strcmp(method,
"ANNOUNCE"))
394 else if (!strcmp(method,
"OPTIONS"))
396 else if (!strcmp(method,
"RECORD"))
398 else if (!strcmp(method,
"SETUP"))
400 else if (!strcmp(method,
"PAUSE"))
402 else if (!strcmp(method,
"TEARDOWN"))
415 && (*methodcode !=
SETUP)) {
432 searchlinept = strchr(linept,
' ');
437 if (searchlinept - linept > urisize - 1) {
441 memcpy(uri, linept, searchlinept - linept);
442 uri[searchlinept - linept] =
'\0';
444 char host[128], path[512], auth[128];
446 char ctl_host[128], ctl_path[512], ctl_auth[128];
449 path,
sizeof(path), uri);
451 sizeof(ctl_host), &ctl_port, ctl_path,
sizeof(ctl_path),
453 if (strcmp(host, ctl_host))
456 if (strcmp(path, ctl_path) && *methodcode !=
SETUP)
458 " %s\n", path, ctl_path);
461 "Updating control URI to %s\n", uri);
466 linept = searchlinept + 1;
478 unsigned char method[10];
485 ret =
read_line(
s, rbuf,
sizeof(rbuf), &rbuflen);
490 sizeof(method), &methodcode);
500 if (methodcode ==
PAUSE) {
504 }
else if (methodcode ==
OPTIONS) {
506 "Public: ANNOUNCE, PAUSE, SETUP, TEARDOWN, "
507 "RECORD\r\n", request.
seq);
508 }
else if (methodcode ==
TEARDOWN) {
557 "Range: npt=%"PRId64
".%03"PRId64
"-\r\n",
607 unsigned char *content =
NULL;
612 "Accept: application/sdp\r\n");
619 "Require: com.real.retain-entity-for-setup\r\n",
643 char proto[128], host[128], path[512], auth[128];
648 const char *lower_proto =
"tcp";
650 unsigned char method[10];
659 av_url_split(proto,
sizeof(proto), auth,
sizeof(auth), host,
sizeof(host),
660 &port, path,
sizeof(path),
s->url);
666 if (!strcmp(proto,
"rtsps")) {
679 &
s->interrupt_callback,
NULL,
680 s->protocol_whitelist,
s->protocol_blacklist,
NULL)) {
687 ret =
read_line(
s, rbuf,
sizeof(rbuf), &rbuflen);
692 sizeof(method), &methodcode);
701 }
else if (methodcode ==
OPTIONS) {
703 }
else if (methodcode ==
RECORD) {
707 }
else if (methodcode ==
SETUP)
801 if (
len > buf_size ||
len < 8)
815 id <= rtsp_st->interleaved_max)
848 for (
i = 0;
i <
s->nb_streams;
i++)
855 "Unsubscribe: %s\r\n",
866 int r, rule_nr, first = 1;
876 for (
r = 0;
r <
s->nb_streams;
r++) {
877 if (
s->streams[
r]->id ==
i) {
953 int64_t timestamp,
int flags)
959 s->streams[stream_index]->time_base,
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.
int ffurl_closep(URLContext **hh)
Close the resource accessed by the URLContext h, and free the memory used by it.
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
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.
#define AVIO_FLAG_READ_WRITE
read-write pseudo flag
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
#define flags(name, subs,...)
#define CONFIG_TLS_PROTOCOL
static int read_header(FFV1Context *f)
@ AVDISCARD_ALL
discard all
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.
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
int av_dict_set_int(AVDictionary **pm, const char *key, int64_t value, int flags)
Convenience wrapper for av_dict_set that converts the value to a string and stores it.
#define AVERROR_PROTOCOL_NOT_FOUND
Protocol not found.
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
#define AVERROR_STREAM_NOT_FOUND
Stream not found.
#define AVERROR_EOF
End of file.
#define AVERROR_OPTION_NOT_FOUND
Option not found.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define AV_LOG_WARNING
Something somehow does not look correct.
#define AV_LOG_VERBOSE
Detailed information.
#define AV_LOG_INFO
Standard information.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
void * av_mallocz_array(size_t nmemb, size_t size)
Allocate a memory block for an array with av_mallocz().
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,...
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
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.
#define AV_NOPTS_VALUE
Undefined timestamp value.
#define AV_TIME_BASE
Internal time base represented as integer.
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
#define LIBAVUTIL_VERSION_INT
common internal API header
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
static av_cold int read_close(AVFormatContext *ctx)
static int read_seek(AVFormatContext *ctx, int stream_index, int64_t timestamp, int flags)
int ff_network_init(void)
void ff_network_close(void)
miscellaneous OS support macros and functions.
void ff_rdt_parse_close(RDTDemuxContext *s)
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.
void ff_rdt_subscribe_rule(char *cmd, int size, int stream_nr, int rule_nr)
Add subscription information to Subscribe parameter string.
void ff_rtp_parse_close(RTPDemuxContext *s)
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,...
void ff_rtp_reset_packet_queue(RTPDemuxContext *s)
int ff_rtp_get_local_rtp_port(URLContext *h)
Return the local rtp port used by the RTP connection.
int ff_rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st)
Open RTSP transport context.
const AVOption ff_rtsp_options[]
void ff_rtsp_close_streams(AVFormatContext *s)
Close and free all streams within the RTSP (de)muxer.
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.
int ff_sdp_parse(AVFormatContext *s, const char *content)
Parse an SDP description of streams by populating an RTSPState struct within the AVFormatContext; als...
#define RTSP_FLAG_LISTEN
Wait for incoming connections.
@ RTSP_SERVER_WMS
Windows Media server.
@ RTSP_SERVER_REAL
Realmedia-style server.
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.
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_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.
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.
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...
void ff_rtsp_parse_line(AVFormatContext *s, RTSPMessageHeader *reply, const char *buf, RTSPState *rt, const char *method)
#define RTSPS_DEFAULT_PORT
@ RTSP_LOWER_TRANSPORT_TCP
TCP; interleaved in RTSP.
@ RTSP_LOWER_TRANSPORT_UDP
UDP/unicast.
void ff_rtsp_close_connections(AVFormatContext *s)
Close all connection handles within the RTSP (de)muxer.
@ RTSP_STATE_SEEKING
initialized, requesting a seek
@ RTSP_STATE_STREAMING
initialized and sending/receiving data
@ RTSP_STATE_PAUSED
initialized, but not receiving data
@ RTSP_STATE_IDLE
not initialized
#define RTSP_DEFAULT_PORT
int ff_rtsp_connect(AVFormatContext *s)
Connect to the RTSP server and set up the individual media streams.
@ RTSP_TRANSPORT_RTP
Standards-compliant RTP.
@ RTSP_TRANSPORT_RDT
Realmedia Data Transport.
RTSPStatusCode
RTSP handling.
@ RTSP_STATUS_ONLY_AGGREGATE
static int ff_rtsp_averror(enum RTSPStatusCode status_code, int default_averror)
static int rtsp_probe(const AVProbeData *p)
static int resetup_tcp(AVFormatContext *s)
static int check_sessionid(AVFormatContext *s, RTSPMessageHeader *request)
int ff_rtsp_setup_input_streams(AVFormatContext *s, RTSPMessageHeader *reply)
Get the description of the stream and set up the RTSPStream child objects.
static int rtsp_read_setup(AVFormatContext *s, char *host, char *controlurl)
static int rtsp_read_close(AVFormatContext *s)
static int rtsp_read_options(AVFormatContext *s)
static int read_line(AVFormatContext *s, char *rbuf, const int rbufsize, int *rbuflen)
static int parse_command_line(AVFormatContext *s, const char *line, int linelen, char *uri, int urisize, char *method, int methodsize, enum RTSPMethod *methodcode)
static int rtsp_send_reply(AVFormatContext *s, enum RTSPStatusCode code, const char *extracontent, uint16_t seq)
static int rtsp_read_request(AVFormatContext *s, RTSPMessageHeader *request, const char *method)
static int rtsp_read_record(AVFormatContext *s)
static int rtsp_read_header(AVFormatContext *s)
static const AVClass rtsp_demuxer_class
int ff_rtsp_parse_streaming_commands(AVFormatContext *s)
Parse RTSP commands (OPTIONS, PAUSE and TEARDOWN) during streaming in listen mode.
static const struct RTSPStatusMessage status_messages[]
static int rtsp_read_announce(AVFormatContext *s)
static int rtsp_read_play(AVFormatContext *s)
AVInputFormat ff_rtsp_demuxer
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.
static int rtsp_listen(AVFormatContext *s)
static int rtsp_read_pause(AVFormatContext *s)
static int rtsp_read_packet(AVFormatContext *s, AVPacket *pkt)
static int rtsp_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
This structure stores compressed data.
This structure contains the data a format has to probe a file.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
int stale
Auth ok, but needs to be resent with a new nonce.
uint64_t first_rtcp_ntp_time
uint64_t last_rtcp_ntp_time
int64_t unwrapped_timestamp
int64_t range_start_offset
Private data for the RTSP demuxer.
char real_challenge[64]
the "RealChallenge1:" field from the server
int nb_rtsp_streams
number of items in the 'rtsp_streams' variable
enum RTSPTransport transport
the negotiated data/packet transport protocol; e.g.
char last_subscription[1024]
the last value of the "SET_PARAMETER Subscribe:" RTSP command.
int timeout
copy of RTSPMessageHeader->timeout, i.e.
HTTPAuthState auth_state
authentication state
int initial_timeout
Timeout to wait for incoming connections.
URLContext * rtsp_hd_out
Additional output handle, used when input and output are done separately, eg for HTTP tunneling.
int lower_transport_mask
A mask with all requested transport methods.
enum AVDiscard * real_setup
current stream setup.
enum RTSPLowerTransport lower_transport
the negotiated network layer transport protocol; e.g.
int64_t last_cmd_time
timestamp of the last RTSP command that we sent to the RTSP server.
int need_subscription
The following are used for Real stream selection.
char session_id[512]
copy of RTSPMessageHeader->session_id, i.e.
enum RTSPServerType server_type
brand of server that we're talking to; e.g.
int rtsp_flags
Various option flags for the RTSP muxer/demuxer.
int64_t seek_timestamp
the seek value requested when calling av_seek_frame().
char control_uri[MAX_URL_SIZE]
some MS RTSP streams contain a URL in the SDP that we need to use for all subsequent RTSP requests,...
int rtp_port_min
Minimum and maximum local UDP ports.
uint64_t packets
The number of returned packets.
enum RTSPClientState state
indicator of whether we are currently receiving data from the server.
enum AVDiscard * real_setup_cache
stream setup during the last frame read.
int initial_pause
Do not begin to play the stream immediately.
int seq
RTSP command sequence number.
struct RTSPStream ** rtsp_streams
streams in this session
int get_parameter_supported
Whether the server supports the GET_PARAMETER method.
Describe a single stream, as identified by a single m= line block in the SDP content.
int interleaved_min
interleave IDs; copies of RTSPTransportField->interleaved_min/max for the selected transport.
char control_url[MAX_URL_SIZE]
url for this stream (from SDP)
URLContext * rtp_handle
RTP stream handle (if UDP)
int stream_index
corresponding stream index, if any.
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...
int mode_record
transport set to record data
enum RTSPLowerTransport lower_transport
network layer transport protocol; e.g.
int interleaved_min
interleave ids, if TCP transport; each TCP/RTSP data packet starts with a '$', stream length and stre...
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
unbuffered private I/O API