Go to the documentation of this file.
55 #define POLL_TIMEOUT_MS 100
56 #define READ_PACKET_TIMEOUT_S 10
57 #define MAX_TIMEOUTS READ_PACKET_TIMEOUT_S * 1000 / POLL_TIMEOUT_MS
58 #define SDP_MAX_SIZE 16384
59 #define RECVBUF_SIZE 10 * RTP_MAX_PACKET_LENGTH
60 #define DEFAULT_REORDERING_DELAY 100000
62 #define OFFSET(x) offsetof(RTSPState, x)
63 #define DEC AV_OPT_FLAG_DECODING_PARAM
64 #define ENC AV_OPT_FLAG_ENCODING_PARAM
66 #define RTSP_FLAG_OPTS(name, longname) \
67 { name, longname, OFFSET(rtsp_flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX, DEC, "rtsp_flags" }, \
68 { "filter_src", "only receive packets from the negotiated peer IP", 0, AV_OPT_TYPE_CONST, {.i64 = RTSP_FLAG_FILTER_SRC}, 0, 0, DEC, "rtsp_flags" }
70 #define RTSP_MEDIATYPE_OPTS(name, longname) \
71 { name, longname, OFFSET(media_type_mask), AV_OPT_TYPE_FLAGS, { .i64 = (1 << (AVMEDIA_TYPE_SUBTITLE+1)) - 1 }, INT_MIN, INT_MAX, DEC, "allowed_media_types" }, \
72 { "video", "Video", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << AVMEDIA_TYPE_VIDEO}, 0, 0, DEC, "allowed_media_types" }, \
73 { "audio", "Audio", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << AVMEDIA_TYPE_AUDIO}, 0, 0, DEC, "allowed_media_types" }, \
74 { "data", "Data", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << AVMEDIA_TYPE_DATA}, 0, 0, DEC, "allowed_media_types" }, \
75 { "subtitle", "Subtitle", 0, AV_OPT_TYPE_CONST, {.i64 = 1 << AVMEDIA_TYPE_SUBTITLE}, 0, 0, DEC, "allowed_media_types" }
77 #define COMMON_OPTS() \
78 { "reorder_queue_size", "set number of packets to buffer for handling of reordered packets", OFFSET(reordering_queue_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, DEC }, \
79 { "buffer_size", "Underlying protocol send/receive buffer size", OFFSET(buffer_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, DEC|ENC }, \
80 { "pkt_size", "Underlying protocol send packet size", OFFSET(pkt_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, ENC } \
84 {
"initial_pause",
"do not start playing the stream immediately",
OFFSET(initial_pause),
AV_OPT_TYPE_BOOL, {.i64 = 0}, 0, 1,
DEC },
86 {
"rtsp_transport",
"set RTSP transport protocols",
OFFSET(lower_transport_mask),
AV_OPT_TYPE_FLAGS, {.i64 = 0}, INT_MIN, INT_MAX,
DEC|
ENC,
"rtsp_transport" }, \
94 {
"prefer_tcp",
"try RTP via TCP first, if available", 0,
AV_OPT_TYPE_CONST, {.i64 =
RTSP_FLAG_PREFER_TCP}, 0, 0,
DEC|
ENC,
"rtsp_flags" },
98 {
"listen_timeout",
"set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen)",
OFFSET(initial_timeout),
AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX,
DEC },
99 #if FF_API_OLD_RTSP_OPTIONS
100 {
"timeout",
"set maximum timeout (in seconds) to wait for incoming connections (-1 is infinite, imply flag listen) (deprecated, use listen_timeout)",
OFFSET(initial_timeout),
AV_OPT_TYPE_INT, {.i64 = -1}, INT_MIN, INT_MAX,
DEC },
101 {
"stimeout",
"set timeout (in microseconds) of socket TCP I/O operations",
OFFSET(stimeout),
AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX,
DEC },
103 {
"timeout",
"set timeout (in microseconds) of socket TCP I/O operations",
OFFSET(stimeout),
AV_OPT_TYPE_INT, {.i64 = 0}, INT_MIN, INT_MAX,
DEC },
107 #if FF_API_OLD_RTSP_OPTIONS
143 const char *sep,
const char **pp)
151 while (!strchr(sep, *p) && *p !=
'\0') {
152 if ((q -
buf) < buf_size - 1)
164 if (**pp ==
'/') (*pp)++;
212 memcpy(sock, ai->ai_addr,
FFMIN(
sizeof(*sock), ai->ai_addrlen));
258 int payload_type,
const char *p)
280 init_rtp_handler(
handler, rtsp_st, st);
323 finalize_rtp_handler_init(
s, rtsp_st, st);
331 char *
value,
int value_size)
346 typedef struct SDPParseState {
351 int nb_default_include_source_addrs;
352 struct RTSPSource **default_include_source_addrs;
353 int nb_default_exclude_source_addrs;
354 struct RTSPSource **default_exclude_source_addrs;
357 char delayed_fmtp[2048];
360 static void copy_default_source_addrs(
struct RTSPSource **addrs,
int count,
367 rtsp_src2 =
av_malloc(
sizeof(*rtsp_src2));
370 memcpy(rtsp_src2, rtsp_src,
sizeof(*rtsp_src));
376 int payload_type,
const char *
line)
392 int letter,
const char *
buf)
395 char buf1[64], st_type[64];
408 if (
s1->skip_media && letter !=
'm')
413 if (strcmp(buf1,
"IN") != 0)
416 if (strcmp(buf1,
"IP4") && strcmp(buf1,
"IP6"))
427 if (
s->nb_streams == 0) {
428 s1->default_ip = sdp_ip;
429 s1->default_ttl = ttl;
440 if (
s->nb_streams == 0) {
451 get_word(st_type,
sizeof(st_type), &p);
452 if (!strcmp(st_type,
"audio")) {
454 }
else if (!strcmp(st_type,
"video")) {
456 }
else if (!strcmp(st_type,
"application")) {
458 }
else if (!strcmp(st_type,
"text")) {
477 copy_default_source_addrs(
s1->default_include_source_addrs,
478 s1->nb_default_include_source_addrs,
481 copy_default_source_addrs(
s1->default_exclude_source_addrs,
482 s1->nb_default_exclude_source_addrs,
490 if (!strcmp(buf1,
"udp"))
492 else if (strstr(buf1,
"/AVPF") || strstr(buf1,
"/SAVPF"))
502 if (CONFIG_RTPDEC && !rt->
ts)
509 finalize_rtp_handler_init(
s, rtsp_st,
NULL);
532 init_rtp_handler(
handler, rtsp_st, st);
533 finalize_rtp_handler_init(
s, rtsp_st, st);
544 if (
s->nb_streams == 0) {
545 if (!strncmp(p,
"rtsp://", 7))
556 if (proto[0] ==
'\0') {
567 }
else if (
av_strstart(p,
"rtpmap:", &p) &&
s->nb_streams > 0) {
570 payload_type = atoi(buf1);
574 sdp_parse_rtpmap(
s, st, rtsp_st, payload_type, p);
584 payload_type = atoi(buf1);
585 if (
s1->seen_rtpmap) {
591 }
else if (
av_strstart(p,
"ssrc:", &p) &&
s->nb_streams > 0) {
594 rtsp_st->
ssrc = strtoll(buf1,
NULL, 10);
605 if (
s->nb_streams > 0) {
614 }
else if (
av_strstart(p,
"IsRealDataType:integer;",&p)) {
617 }
else if (
av_strstart(p,
"SampleRate:integer;", &p) &&
619 st =
s->streams[
s->nb_streams - 1];
621 }
else if (
av_strstart(p,
"crypto:", &p) &&
s->nb_streams > 0) {
632 if (strcmp(buf1,
"incl") && strcmp(buf1,
"excl"))
634 exclude = !strcmp(buf1,
"excl");
637 if (strcmp(buf1,
"IN") != 0)
640 if (strcmp(buf1,
"IP4") && strcmp(buf1,
"IP6") && strcmp(buf1,
"*"))
651 if (
s->nb_streams == 0) {
652 dynarray_add(&
s1->default_exclude_source_addrs, &
s1->nb_default_exclude_source_addrs, rtsp_src);
658 if (
s->nb_streams == 0) {
659 dynarray_add(&
s1->default_include_source_addrs, &
s1->nb_default_include_source_addrs, rtsp_src);
669 if (
s->nb_streams > 0) {
699 SDPParseState sdp_parse_state = { { 0 } }, *
s1 = &sdp_parse_state;
713 while (*p !=
'\n' && *p !=
'\r' && *p !=
'\0') {
714 if ((q -
buf) <
sizeof(
buf) - 1)
719 sdp_parse_line(
s,
s1, letter,
buf);
721 while (*p !=
'\n' && *p !=
'\0')
727 for (
i = 0;
i <
s1->nb_default_include_source_addrs;
i++)
730 for (
i = 0;
i <
s1->nb_default_exclude_source_addrs;
i++)
752 if (CONFIG_RTSP_MUXER && rtpctx->
pb && send_packets)
802 if (CONFIG_RTPDEC && rt->
ts)
813 if (reordering_queue_size < 0) {
815 reordering_queue_size = 0;
826 if (CONFIG_RTSP_MUXER &&
s->oformat && st) {
842 else if (CONFIG_RTPDEC)
845 reordering_queue_size);
867 #if CONFIG_RTSP_DEMUXER || CONFIG_RTSP_MUXER
868 static void rtsp_parse_range(
int *min_ptr,
int *max_ptr,
const char **pp)
876 v = strtol(q, &p, 10);
880 v = strtol(p, &p, 10);
893 char transport_protocol[16];
895 char lower_transport[16];
909 get_word_sep(transport_protocol,
sizeof(transport_protocol),
913 lower_transport[0] =
'\0';
920 }
else if (!
av_strcasecmp (transport_protocol,
"x-pn-tng") ||
923 get_word_sep(lower_transport,
sizeof(lower_transport),
"/;,", &p);
928 lower_transport[0] =
'\0';
944 while (*p !=
'\0' && *p !=
',') {
946 if (!strcmp(parameter,
"port")) {
949 rtsp_parse_range(&
th->port_min, &
th->port_max, &p);
951 }
else if (!strcmp(parameter,
"client_port")) {
954 rtsp_parse_range(&
th->client_port_min,
955 &
th->client_port_max, &p);
957 }
else if (!strcmp(parameter,
"server_port")) {
960 rtsp_parse_range(&
th->server_port_min,
961 &
th->server_port_max, &p);
963 }
else if (!strcmp(parameter,
"interleaved")) {
966 rtsp_parse_range(&
th->interleaved_min,
967 &
th->interleaved_max, &p);
969 }
else if (!strcmp(parameter,
"multicast")) {
972 }
else if (!strcmp(parameter,
"ttl")) {
976 th->ttl = strtol(p, &
end, 10);
979 }
else if (!strcmp(parameter,
"destination")) {
985 }
else if (!strcmp(parameter,
"source")) {
991 }
else if (!strcmp(parameter,
"mode")) {
995 if (!strcmp(
buf,
"record") ||
996 !strcmp(
buf,
"receive"))
1001 while (*p !=
';' && *p !=
'\0' && *p !=
',')
1015 static void handle_rtp_info(
RTSPState *rt,
const char *url,
1016 uint32_t seq, uint32_t rtptime)
1019 if (!rtptime || !url[0])
1035 static void rtsp_parse_rtp_info(
RTSPState *rt,
const char *p)
1038 char key[20],
value[1024], url[1024] =
"";
1039 uint32_t seq = 0, rtptime = 0;
1051 if (!strcmp(
key,
"url"))
1053 else if (!strcmp(
key,
"seq"))
1055 else if (!strcmp(
key,
"rtptime"))
1058 handle_rtp_info(rt, url, seq, rtptime);
1067 handle_rtp_info(rt, url, seq, rtptime);
1082 (t = strtol(p,
NULL, 10)) > 0) {
1088 rtsp_parse_transport(
s, reply, p);
1090 reply->
seq = strtol(p,
NULL, 10);
1105 }
else if (
av_stristart(p,
"WWW-Authenticate:", &p) && rt) {
1108 }
else if (
av_stristart(p,
"Authentication-Info:", &p) && rt) {
1111 }
else if (
av_stristart(p,
"Content-Base:", &p) && rt) {
1113 if (method && !strcmp(method,
"DESCRIBE"))
1117 if (method && !strcmp(method,
"PLAY"))
1118 rtsp_parse_rtp_info(rt, p);
1120 if (strstr(p,
"GET_PARAMETER") &&
1121 method && !strcmp(method,
"OPTIONS"))
1123 }
else if (
av_stristart(p,
"x-Accept-Dynamic-Rate:", &p) && rt) {
1149 if (len1 >
sizeof(
buf))
1159 unsigned char **content_ptr,
1160 int return_on_interleaved_data,
const char *method)
1163 char buf[4096], buf1[1024], *q;
1166 int ret, content_length, line_count = 0, request = 0;
1167 unsigned char *content =
NULL;
1173 memset(reply, 0,
sizeof(*reply));
1186 if (
ch ==
'$' && q ==
buf) {
1187 if (return_on_interleaved_data) {
1191 }
else if (
ch !=
'\r') {
1192 if ((q -
buf) <
sizeof(
buf) - 1)
1204 if (line_count == 0) {
1207 if (!strncmp(buf1,
"RTSP/", 5)) {
1228 if (content_length > 0) {
1230 content =
av_malloc(content_length + 1);
1234 content[content_length] =
'\0';
1237 *content_ptr = content;
1244 const char* ptr =
buf;
1246 if (!strcmp(reply->
reason,
"OPTIONS")) {
1279 if (rt->
seq != reply->
seq) {
1285 if (reply->
notice == 2101 ||
1287 reply->
notice == 2306 ) {
1289 }
else if (reply->
notice >= 4400 && reply->
notice < 5500) {
1291 }
else if (reply->
notice == 2401 ||
1312 const char *method,
const char *url,
1314 const unsigned char *send_content,
1315 int send_content_length)
1318 char buf[4096], *out_buf;
1333 !strstr(
headers,
"\nIf-Match:"))) {
1338 rt->
auth, url, method);
1343 if (send_content_length > 0 && send_content)
1350 out_buf = base64buf;
1356 if (send_content_length > 0 && send_content) {
1369 const char *url,
const char *
headers)
1371 return rtsp_send_cmd_with_content_async(
s, method, url,
headers,
NULL, 0);
1376 unsigned char **content_ptr)
1379 content_ptr,
NULL, 0);
1383 const char *method,
const char *url,
1386 unsigned char **content_ptr,
1387 const unsigned char *send_content,
1388 int send_content_length)
1392 int ret, attempts = 0;
1396 if ((
ret = rtsp_send_cmd_with_content_async(
s, method, url,
header,
1398 send_content_length)))
1422 int lower_transport,
const char *real_challenge)
1429 const char *trans_pref;
1432 trans_pref =
"x-pn-tng";
1434 trans_pref =
"RAW/RAW";
1436 trans_pref =
"RTP/AVP";
1446 port_off -= port_off & 0x01;
1448 for (j = rt->
rtp_port_min + port_off,
i = 0; i < rt->nb_rtsp_streams; ++
i) {
1449 char transport[2048];
1485 while (j <= rt->rtp_port_max) {
1489 "?localport=%d", j);
1493 &
s->interrupt_callback, &
opts,
s->protocol_whitelist,
s->protocol_blacklist,
NULL);
1507 snprintf(transport,
sizeof(transport) - 1,
1508 "%s/UDP;", trans_pref);
1510 av_strlcat(transport,
"unicast;",
sizeof(transport));
1512 "client_port=%d", port);
1515 av_strlcatf(transport,
sizeof(transport),
"-%d", port + 1);
1528 snprintf(transport,
sizeof(transport) - 1,
1529 "%s/TCP;", trans_pref);
1531 av_strlcat(transport,
"unicast;",
sizeof(transport));
1533 "interleaved=%d-%d",
1539 snprintf(transport,
sizeof(transport) - 1,
1540 "%s/UDP;multicast", trans_pref);
1543 av_strlcat(transport,
";mode=record",
sizeof(transport));
1546 av_strlcat(transport,
";mode=play",
sizeof(transport));
1548 "Transport: %s\r\n",
1551 av_strlcat(cmd,
"x-Dynamic-Rate: 0\r\n",
sizeof(cmd));
1553 char real_res[41], real_csum[9];
1558 "RealChallenge2: %s, sd=%s\r\n",
1598 char url[1024],
options[30] =
"";
1599 const char *peer = host;
1616 char url[1024], namebuf[50], optbuf[20] =
"";
1630 snprintf(optbuf,
sizeof(optbuf),
"?ttl=%d", ttl);
1631 getnameinfo((
struct sockaddr*) &addr,
sizeof(addr),
1634 port,
"%s", optbuf);
1636 &
s->interrupt_callback,
NULL,
s->protocol_whitelist,
s->protocol_blacklist,
NULL) < 0) {
1672 char proto[128], host[1024], path[1024];
1673 char tcpname[1024], cmd[2048], auth[128];
1674 const char *lower_rtsp_proto =
"tcp";
1675 int port, err, tcp_fd;
1677 int lower_transport_mask = 0;
1679 int https_tunnel = 0;
1680 char real_challenge[64] =
"";
1682 socklen_t peer_len =
sizeof(peer);
1694 if (
s->max_delay < 0)
1708 memset(&reply1, 0,
sizeof(reply1));
1711 host,
sizeof(host), &port, path,
sizeof(path),
s->url);
1713 if (!strcmp(proto,
"rtsps")) {
1714 lower_rtsp_proto =
"tls";
1723 port = default_port;
1727 if (!lower_transport_mask)
1736 "only UDP and TCP are supported for output.\n");
1746 host, port,
"%s", path);
1750 char httpname[1024];
1751 char sessioncookie[17];
1757 ff_url_join(httpname,
sizeof(httpname), https_tunnel ?
"https" :
"http", auth, host, port,
"%s", path);
1758 snprintf(sessioncookie,
sizeof(sessioncookie),
"%08x%08x",
1763 &
s->interrupt_callback) < 0) {
1770 "x-sessioncookie: %s\r\n"
1771 "Accept: application/x-rtsp-tunnelled\r\n"
1772 "Pragma: no-cache\r\n"
1773 "Cache-Control: no-cache\r\n",
1794 &
s->interrupt_callback) < 0 ) {
1801 "x-sessioncookie: %s\r\n"
1802 "Content-Type: application/x-rtsp-tunnelled\r\n"
1803 "Pragma: no-cache\r\n"
1804 "Cache-Control: no-cache\r\n"
1805 "Content-Length: 32767\r\n"
1806 "Expires: Sun, 9 Jan 1972 00:00:00 GMT\r\n",
1844 &
s->interrupt_callback,
NULL,
s->protocol_whitelist,
s->protocol_blacklist,
NULL)) < 0) {
1857 if (!getpeername(tcp_fd, (
struct sockaddr*) &peer, &peer_len)) {
1858 getnameinfo((
struct sockaddr*) &peer, peer_len, host,
sizeof(host),
1877 "ClientChallenge: 9e26d33f2984236010ef6253fb1887f7\r\n"
1878 "PlayerStarttime: [28/03/2003:22:50:23 00:00]\r\n"
1879 "CompanyID: KnKV4M4I/B2FjJ1TToLycw==\r\n"
1880 "GUID: 00000000-0000-0000-0000-000000000000\r\n",
1899 if (CONFIG_RTSP_DEMUXER &&
s->iformat)
1901 else if (CONFIG_RTSP_MUXER)
1909 int lower_transport =
ff_log2_tab[lower_transport_mask &
1910 ~(lower_transport_mask - 1)];
1918 real_challenge :
NULL);
1921 lower_transport_mask &= ~(1 << lower_transport);
1922 if (lower_transport_mask == 0 && err == 1) {
1923 err =
AVERROR(EPROTONOSUPPORT);
1967 "Unable to answer to TEARDOWN\n");
1984 uint8_t *
buf,
int buf_size, int64_t wait_end)
1988 int n,
i,
ret, timeout_cnt = 0;
1989 struct pollfd *p = rt->
p;
1990 int *fds =
NULL, fdsnum, fdsidx;
1999 p[rt->
max_p++].events = POLLIN;
2011 "Number of fds %d not supported\n", fdsnum);
2014 for (fdsidx = 0; fdsidx < fdsnum; fdsidx++) {
2015 p[rt->
max_p].fd = fds[fdsidx];
2016 p[rt->
max_p++].events = POLLIN;
2035 if (p[j].revents & POLLIN || p[j+1].revents & POLLIN) {
2038 *prtsp_st = rtsp_st;
2045 #if CONFIG_RTSP_DEMUXER
2046 if (rt->
rtsp_hd && p[0].revents & POLLIN) {
2047 if ((
ret = parse_rtsp_message(
s)) < 0) {
2054 }
else if (
n < 0 && errno != EINTR)
2086 "Unable to pick stream for packet - SSRC not known for "
2112 #if CONFIG_RTSP_DEMUXER
2146 int64_t wait_end = 0;
2157 }
else if (CONFIG_RTPDEC && rt->
ts) {
2168 }
else if (
ret == 1) {
2177 int64_t first_queue_time = 0;
2184 if (queue_time && (queue_time - first_queue_time < 0 ||
2185 !first_queue_time)) {
2186 first_queue_time = queue_time;
2190 if (first_queue_time) {
2191 wait_end = first_queue_time +
s->max_delay;
2194 first_queue_st =
NULL;
2206 if (
len ==
AVERROR(EAGAIN) && first_queue_st &&
2209 "max delay reached. need to consume packet\n");
2210 rtsp_st = first_queue_st;
2245 if (rtpctx2 && st && st2 &&
2257 s->start_time_realtime -=
2274 }
else if (CONFIG_RTPDEC && rt->
ts) {
2300 #if CONFIG_SDP_DEMUXER
2306 while (p < p_end && *p !=
'\0') {
2307 if (
sizeof(
"c=IN IP") - 1 < p_end - p &&
2311 while (p < p_end - 1 && *p !=
'\n') p++;
2320 static void append_source_addrs(
char *
buf,
int size,
const char *
name,
2342 if (
s->max_delay < 0)
2357 content[
size] =
'\0';
2382 "?localport=%d&ttl=%d&connect=%d&write_to_source=%d",
2387 append_source_addrs(url,
sizeof(url),
"sources",
2390 append_source_addrs(url,
sizeof(url),
"block",
2394 &
s->interrupt_callback, &
opts,
s->protocol_whitelist,
s->protocol_blacklist,
NULL);
2420 static const AVClass sdp_demuxer_class = {
2435 .priv_class = &sdp_demuxer_class,
2439 #if CONFIG_RTP_DEMUXER
2450 char host[500], sdp[500];
2457 socklen_t addrlen =
sizeof(addr);
2464 &
s->interrupt_callback,
NULL,
s->protocol_whitelist,
s->protocol_blacklist,
NULL);
2479 if ((recvbuf[0] & 0xc0) != 0x80) {
2488 payload_type = recvbuf[1] & 0x7f;
2503 "without an SDP file describing it\n",
2509 "properly you need an SDP file "
2517 "v=0\r\nc=IN IP%d %s\r\nm=%s %d RTP/AVP %d\r\n",
2518 addr.ss_family == AF_INET ? 4 : 6, host,
2521 port, payload_type);
2533 ret = sdp_read_header(
s);
2545 static const AVClass rtp_demuxer_class = {
2561 .priv_class = &rtp_demuxer_class,
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...
int64_t last_cmd_time
timestamp of the last RTSP command that we sent to the RTSP server.
int64_t av_gettime_relative(void)
Get the current time in microseconds since some unspecified starting point.
#define AV_LOG_WARNING
Something somehow does not look correct.
void ff_rtsp_close_streams(AVFormatContext *s)
Close and free all streams within the RTSP (de)muxer.
int(* init)(AVFormatContext *s, int st_index, PayloadContext *priv_data)
Initialize dynamic protocol handler, called after the full rtpmap line is parsed, may be null.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
void * transport_priv
RTP/RDT parse context if input, RTP AVFormatContext if output.
enum AVMediaType codec_type
General type of the encoded data.
int ff_rtsp_send_cmd_with_content(AVFormatContext *s, const char *method, const char *url, const char *headers, RTSPMessageHeader *reply, unsigned char **content_ptr, const unsigned char *send_content, int send_content_length)
Send a command to the RTSP server and wait for the reply.
int(* parse_sdp_a_line)(AVFormatContext *s, int st_index, PayloadContext *priv_data, const char *line)
Parse the a= line from the sdp field.
URLContext * rtp_handle
RTP stream handle (if UDP)
enum AVCodecID ff_rtp_codec_id(const char *buf, enum AVMediaType codec_type)
Return the codec id for the given encoding name and codec type.
char control_uri[1024]
some MS RTSP streams contain a URL in the SDP that we need to use for all subsequent RTSP requests,...
int ff_rtp_send_rtcp_feedback(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio)
@ RTSP_SERVER_RTP
Standards-compliant RTP-server.
This struct describes the properties of an encoded stream.
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.
enum RTSPControlTransport control_transport
RTSP transport mode, such as plain or tunneled.
#define AVERROR_EOF
End of file.
int avpriv_mpegts_parse_packet(MpegTSContext *ts, AVPacket *pkt, const uint8_t *buf, int len)
#define AVIO_FLAG_READ_WRITE
read-write pseudo flag
@ RTSP_MODE_PLAIN
Normal RTSP.
static int parse_fmtp(AVFormatContext *s, AVStream *stream, PayloadContext *data, const char *attr, const char *value)
@ RTSP_TRANSPORT_RTP
Standards-compliant RTP.
char source[INET6_ADDRSTRLEN+1]
source IP address
uint8_t pi<< 24) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_U8,(uint64_t)((*(const uint8_t *) pi - 0x80U))<< 56) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16,(*(const int16_t *) pi >>8)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S16,(uint64_t)(*(const int16_t *) pi)<< 48) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32,(*(const int32_t *) pi >>24)+0x80) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_S32,(uint64_t)(*(const int32_t *) pi)<< 32) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S64,(*(const int64_t *) pi >>56)+0x80) CONV_FUNC(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0f/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S64, *(const int64_t *) pi *(1.0/(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_FLT, llrintf(*(const float *) pi *(INT64_C(1)<< 63))) CONV_FUNC(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) CONV_FUNC(AV_SAMPLE_FMT_S64, int64_t, AV_SAMPLE_FMT_DBL, llrint(*(const double *) pi *(INT64_C(1)<< 63))) #define FMT_PAIR_FUNC(out, in) static conv_func_type *const fmt_pair_to_conv_functions[AV_SAMPLE_FMT_NB *AV_SAMPLE_FMT_NB]={ FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_U8), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S16), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S32), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_FLT), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_DBL), FMT_PAIR_FUNC(AV_SAMPLE_FMT_U8, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_FLT, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_DBL, AV_SAMPLE_FMT_S64), FMT_PAIR_FUNC(AV_SAMPLE_FMT_S64, AV_SAMPLE_FMT_S64), };static void cpy1(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, len);} static void cpy2(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 2 *len);} static void cpy4(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 4 *len);} static void cpy8(uint8_t **dst, const uint8_t **src, int len){ memcpy(*dst, *src, 8 *len);} AudioConvert *swri_audio_convert_alloc(enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, const int *ch_map, int flags) { AudioConvert *ctx;conv_func_type *f=fmt_pair_to_conv_functions[av_get_packed_sample_fmt(out_fmt)+AV_SAMPLE_FMT_NB *av_get_packed_sample_fmt(in_fmt)];if(!f) return NULL;ctx=av_mallocz(sizeof(*ctx));if(!ctx) return NULL;if(channels==1){ in_fmt=av_get_planar_sample_fmt(in_fmt);out_fmt=av_get_planar_sample_fmt(out_fmt);} ctx->channels=channels;ctx->conv_f=f;ctx->ch_map=ch_map;if(in_fmt==AV_SAMPLE_FMT_U8||in_fmt==AV_SAMPLE_FMT_U8P) memset(ctx->silence, 0x80, sizeof(ctx->silence));if(out_fmt==in_fmt &&!ch_map) { switch(av_get_bytes_per_sample(in_fmt)){ case 1:ctx->simd_f=cpy1;break;case 2:ctx->simd_f=cpy2;break;case 4:ctx->simd_f=cpy4;break;case 8:ctx->simd_f=cpy8;break;} } if(HAVE_X86ASM &&1) swri_audio_convert_init_x86(ctx, out_fmt, in_fmt, channels);if(ARCH_ARM) swri_audio_convert_init_arm(ctx, out_fmt, in_fmt, channels);if(ARCH_AARCH64) swri_audio_convert_init_aarch64(ctx, out_fmt, in_fmt, channels);return ctx;} void swri_audio_convert_free(AudioConvert **ctx) { av_freep(ctx);} int swri_audio_convert(AudioConvert *ctx, AudioData *out, AudioData *in, int len) { int ch;int off=0;const int os=(out->planar ? 1 :out->ch_count) *out->bps;unsigned misaligned=0;av_assert0(ctx->channels==out->ch_count);if(ctx->in_simd_align_mask) { int planes=in->planar ? in->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) in->ch[ch];misaligned|=m &ctx->in_simd_align_mask;} if(ctx->out_simd_align_mask) { int planes=out->planar ? out->ch_count :1;unsigned m=0;for(ch=0;ch< planes;ch++) m|=(intptr_t) out->ch[ch];misaligned|=m &ctx->out_simd_align_mask;} if(ctx->simd_f &&!ctx->ch_map &&!misaligned){ off=len &~15;av_assert1(off >=0);av_assert1(off<=len);av_assert2(ctx->channels==SWR_CH_MAX||!in->ch[ctx->channels]);if(off >0){ if(out->planar==in->planar){ int planes=out->planar ? out->ch_count :1;for(ch=0;ch< planes;ch++){ ctx->simd_f(out-> ch ch
static const AVOption sdp_options[]
int get_parameter_supported
Whether the server supports the GET_PARAMETER method.
static int ff_rtsp_averror(enum RTSPStatusCode status_code, int default_averror)
int av_strcasecmp(const char *a, const char *b)
Locale-independent case-insensitive compare.
#define RTSP_DEFAULT_AUDIO_SAMPLERATE
int nb_include_source_addrs
Number of source-specific multicast include source IP addresses (from SDP content)
static av_cold int end(AVCodecContext *avctx)
int server_port_min
UDP unicast server port range; the ports to which we should connect to receive unicast UDP RTP/RTCP d...
char auth[128]
plaintext authorization line (username:password)
int interleaved_min
interleave IDs; copies of RTSPTransportField->interleaved_min/max for the selected transport.
static const AVOption rtp_options[]
#define RTSP_RTP_PORT_MIN
enum RTSPLowerTransport lower_transport
network layer transport protocol; e.g.
int rtp_port_min
Minimum and maximum local UDP ports.
@ RTSP_LOWER_TRANSPORT_CUSTOM
Custom IO - not a public option for lower_transport_mask, but set in the SDP demuxer based on a flag.
int interleaved_min
interleave ids, if TCP transport; each TCP/RTSP data packet starts with a '$', stream length and stre...
Describe a single stream, as identified by a single m= line block in the SDP content.
#define AV_LOG_VERBOSE
Detailed information.
int ffurl_close(URLContext *h)
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.
char real_challenge[64]
the "RealChallenge1:" field from the server
void ff_rdt_calc_response_and_checksum(char response[41], char chksum[9], const char *challenge)
Calculate the response (RealChallenge2 in the RTSP header) to the challenge (RealChallenge1 in the RT...
int buf_size
Size of buf except extra allocated bytes.
void ff_network_close(void)
@ RTSP_SERVER_REAL
Realmedia-style server.
char * ff_http_auth_create_response(HTTPAuthState *state, const char *auth, const char *path, const char *method)
int ff_rtp_check_and_send_back_rr(RTPDemuxContext *s, URLContext *fd, AVIOContext *avio, int count)
some rtp servers assume client is dead if they don't hear from them...
enum AVMediaType codec_type
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
int64_t seek_timestamp
the seek value requested when calling av_seek_frame().
int ff_network_init(void)
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 FF_RTP_FLAG_OPTS(ctx, fieldname)
static AVDictionary * map_to_opts(RTSPState *rt)
int feedback
Enable sending RTCP feedback messages according to RFC 4585.
uint32_t av_get_random_seed(void)
Get a seed to use in conjunction with random functions.
AVFormatContext * asf_ctx
The following are used for RTP/ASF streams.
void avformat_close_input(AVFormatContext **s)
Close an opened input AVFormatContext.
int ff_rtp_get_local_rtp_port(URLContext *h)
Return the local rtp port used by the RTP connection.
int ff_rtp_set_remote_url(URLContext *h, const char *uri)
If no filename is given to av_open_input_file because you want to get the local port first,...
int nb_rtsp_streams
number of items in the 'rtsp_streams' variable
int ffurl_connect(URLContext *uc, AVDictionary **options)
Connect an URLContext that has been allocated by ffurl_alloc.
static av_cold int read_close(AVFormatContext *ctx)
int ff_rdt_parse_packet(RDTDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
Parse RDT-style packet data (header + media data).
static void get_word(char *buf, int buf_size, const char **pp)
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
void(* close)(PayloadContext *protocol_data)
Free any data needed by the rtp parsing for this dynamic data.
void ff_rtp_parse_set_crypto(RTPDemuxContext *s, const char *suite, const char *params)
@ RTSP_TRANSPORT_RDT
Realmedia Data Transport.
int ff_check_interrupt(AVIOInterruptCB *cb)
Check if the user has requested to interrupt a blocking function associated with cb.
@ RTSP_STATE_STREAMING
initialized and sending/receiving data
int ff_rtsp_setup_input_streams(AVFormatContext *s, RTSPMessageHeader *reply)
Get the description of the stream and set up the RTSPStream child objects.
int lower_transport_mask
A mask with all requested transport methods.
@ RTSP_MODE_TUNNEL
RTSP over HTTP (tunneling)
int stream_index
corresponding stream index, if any.
struct sockaddr_storage destination
destination IP address
void ff_rdt_parse_close(RDTDemuxContext *s)
@ RTSP_LOWER_TRANSPORT_HTTPS
HTTPS tunneled.
URLContext * rtsp_hd_out
Additional output handle, used when input and output are done separately, eg for HTTP tunneling.
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
void avpriv_mpegts_parse_close(MpegTSContext *ts)
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define RTSP_FLAG_LISTEN
Wait for incoming connections.
int reordering_queue_size
Size of RTP packet reordering queue.
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.
struct MpegTSContext * ts
The following are used for parsing raw mpegts in udp.
This struct describes the properties of a single codec described by an AVCodecID.
struct pollfd * p
Polling array for udp.
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
#define RTSP_TCP_MAX_PACKET_SIZE
int ff_url_join(char *str, int size, const char *proto, const char *authorization, const char *hostname, int port, const char *fmt,...)
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define AVIO_FLAG_WRITE
write-only
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_LOG_DEBUG
Stuff which is only useful for libav* developers.
enum AVStreamParseType need_parsing
int ff_rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st)
Open RTSP transport context.
int ttl
time-to-live value (required for multicast); the amount of HOPs that packets will be allowed to make ...
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
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...
const RTPDynamicProtocolHandler * dynamic_handler
The following are used for dynamic protocols (rtpdec_*.c/rdt.c)
int av_stristart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str independent of case.
@ AVMEDIA_TYPE_DATA
Opaque data information usually continuous.
#define RTSP_FLAG_OPTS(name, longname)
const RTPDynamicProtocolHandler * ff_rtp_handler_find_by_id(int id, enum AVMediaType codec_type)
Find a registered rtp dynamic protocol handler with a matching codec ID.
static void handler(vbi_event *ev, void *user_data)
#define RTP_REORDER_QUEUE_DEFAULT_SIZE
void ff_http_auth_handle_header(HTTPAuthState *state, const char *key, const char *value)
int ff_rtsp_setup_output_streams(AVFormatContext *s, const char *addr)
Announce the stream to the server and set up the RTSPStream child objects for each media stream.
#define RTSP_MEDIATYPE_OPTS(name, longname)
AVCodecParameters * codecpar
Codec parameters associated with this stream.
char session_id[512]
copy of RTSPMessageHeader->session_id, i.e.
#define LIBAVUTIL_VERSION_INT
static int read_header(FFV1Context *f)
Describe the class of an AVClass context structure.
const char * protocol_whitelist
int ff_rtsp_next_attr_and_value(const char **p, char *attr, int attr_size, char *value, int value_size)
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
void avcodec_parameters_free(AVCodecParameters **par)
Free an AVCodecParameters instance and everything associated with it and write NULL to the supplied p...
int64_t ff_rtp_queued_packet_time(RTPDemuxContext *s)
void ff_http_init_auth_state(URLContext *dest, const URLContext *src)
Initialize the authentication state based on another HTTP URLContext.
const char * av_default_item_name(void *ptr)
Return the context name.
AVIOContext * pb
I/O context.
static void get_word_sep(char *buf, int buf_size, const char *sep, const char **pp)
This structure contains the data a format has to probe a file.
#define RTSP_MAX_TRANSPORTS
int av_parse_time(int64_t *timeval, const char *timestr, int duration)
Parse timestr and return in *time a corresponding number of microseconds.
enum RTSPClientState state
indicator of whether we are currently receiving data from the server.
uint8_t * recvbuf
Reusable buffer for receiving packets.
#define RTSP_FLAG_PREFER_TCP
Try RTP via TCP first if possible.
int sdp_port
The following are used only in SDP, not RTSP.
struct RTSPSource ** exclude_source_addrs
Source-specific multicast exclude source IP addresses (from SDP content)
int sample_rate
Audio only.
const uint8_t ff_log2_tab[256]
static int get_sockaddr(AVFormatContext *s, const char *buf, struct sockaddr_storage *sock)
void ff_rtp_parse_close(RTPDemuxContext *s)
int av_strncasecmp(const char *a, const char *b, size_t n)
Locale-independent case-insensitive compare.
static void interleave(uint8_t *dst, uint8_t *src, int w, int h, int dst_linesize, int src_linesize, enum FilterMode mode, int swap)
#define RTP_PT_IS_RTCP(x)
const OptionDef options[]
RTPDemuxContext * ff_rtp_parse_open(AVFormatContext *s1, AVStream *st, int payload_type, int queue_size)
open a new RTP parse context for stream 'st'.
int ffio_init_context(AVIOContext *s, unsigned char *buffer, int buffer_size, int write_flag, void *opaque, int(*read_packet)(void *opaque, uint8_t *buf, int buf_size), int(*write_packet)(void *opaque, uint8_t *buf, int buf_size), int64_t(*seek)(void *opaque, int64_t offset, int whence))
PayloadContext * dynamic_protocol_context
private data associated with the dynamic protocol
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification.
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.
int rtsp_flags
Various option flags for the RTSP muxer/demuxer.
int ffurl_get_multi_file_handle(URLContext *h, int **handles, int *numhandles)
Return the file descriptors associated with this URL.
const AVOption ff_rtsp_options[]
void ff_rtsp_close_connections(AVFormatContext *s)
Close all connection handles within the RTSP (de)muxer.
Private data for the RTSP demuxer.
struct RTSPSource ** include_source_addrs
Source-specific multicast include source IP addresses (from SDP content)
enum RTSPLowerTransport lower_transport
the negotiated network layer transport protocol; e.g.
char last_reply[2048]
The last reply of the server to a RTSP command.
enum RTSPTransport transport
data/packet transport protocol; e.g.
uint64_t first_rtcp_ntp_time
struct RTSPStream ** rtsp_streams
streams in this session
#define AV_NOPTS_VALUE
Undefined timestamp value.
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_RB32
void avpriv_report_missing_feature(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
int seq
RTSP command sequence number.
@ AVMEDIA_TYPE_UNKNOWN
Usually treated as AVMEDIA_TYPE_DATA.
static const uint8_t header[24]
HTTPAuthState auth_state
authentication state
void ff_rtsp_skip_packet(AVFormatContext *s)
Skip a RTP/TCP interleaved packet.
int ff_rtp_get_codec_info(AVCodecParameters *par, int payload_type)
Initialize a codec context based on the payload type.
const RTPDynamicProtocolHandler * ff_rtp_handler_find_by_name(const char *name, enum AVMediaType codec_type)
Find a registered rtp dynamic protocol handler with the specified name.
RDTDemuxContext * ff_rdt_parse_open(AVFormatContext *ic, int first_stream_of_set_idx, void *priv_data, const RTPDynamicProtocolHandler *handler)
Allocate and init the RDT parsing context.
void ff_rtsp_parse_line(AVFormatContext *s, RTSPMessageHeader *reply, const char *buf, RTSPState *rt, const char *method)
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values.
int av_strstart(const char *str, const char *pfx, const char **ptr)
Return non-zero if pfx is a prefix of str.
int nb_exclude_source_addrs
Number of source-specific multicast exclude source IP addresses (from SDP content)
void ff_real_parse_sdp_a_line(AVFormatContext *s, int stream_index, const char *line)
Parse a server-related SDP line.
int timeout
copy of RTSPMessageHeader->timeout, i.e.
#define AV_LOG_INFO
Standard information.
#define DEFAULT_REORDERING_DELAY
int ffurl_alloc(URLContext **puc, const char *filename, int flags, const AVIOInterruptCB *int_cb)
Create a URLContext for accessing to the resource indicated by url, but do not initiate the connectio...
AVCodecParameters * avcodec_parameters_alloc(void)
Allocate a new AVCodecParameters and set its fields to default values (unknown/invalid/0).
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi - 0x80) *(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t, *(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t, *(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31)))) #define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac) { } void ff_audio_convert_free(AudioConvert **ac) { if(! *ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);} AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map) { AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method !=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2) { ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc) { av_free(ac);return NULL;} return ac;} in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar) { ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar ? ac->channels :1;} else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;} int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in) { int use_generic=1;int len=in->nb_samples;int p;if(ac->dc) { av_log(ac->avr, AV_LOG_TRACE, "%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
int avio_closep(AVIOContext **s)
Close the resource accessed by the AVIOContext *s, free it and set the pointer pointing to it to NULL...
int av_write_trailer(AVFormatContext *s)
Write the stream trailer to an output media file and free the file private data.
@ HTTP_AUTH_NONE
No authentication specified.
#define AV_BASE64_SIZE(x)
Calculate the output size needed to base64-encode x bytes to a null-terminated string.
int media_type_mask
Mask of all requested media types.
#define i(width, name, range_min, range_max)
char addr[128]
Source-specific multicast include source IP address (from SDP content)
const AVCodecDescriptor * avcodec_descriptor_get(enum AVCodecID id)
int ff_rtp_parse_packet(RTPDemuxContext *s, AVPacket *pkt, uint8_t **bufptr, int len)
Parse an RTP or RTCP packet directly sent as a buffer.
#define av_malloc_array(a, b)
int need_subscription
The following are used for Real stream selection.
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf default value
int ff_rtsp_tcp_write_packet(AVFormatContext *s, RTSPStream *rtsp_st)
Send buffered packets over TCP.
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 ff_rtsp_parse_streaming_commands(AVFormatContext *s)
Parse RTSP commands (OPTIONS, PAUSE and TEARDOWN) during streaming in listen mode.
uint32_t ssrc
SSRC for this stream, to allow identifying RTCP packets before the first RTP packet.
FFmpeg currently uses a custom build this text attempts to document some of its obscure features and options Makefile the full command issued by make and its output will be shown on the screen DBG Preprocess x86 external assembler files to a dbg asm file in the object which then gets compiled Helps in developing those assembler files DESTDIR Destination directory for the install useful to prepare packages or install FFmpeg in cross environments GEN Set to ‘1’ to generate the missing or mismatched references Makefile builds all the libraries and the executables fate Run the fate test note that you must have installed it fate list List all fate regression test targets install Install headers
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
@ RTSP_LOWER_TRANSPORT_TCP
TCP; interleaved in RTSP.
int sdp_ttl
IP Time-To-Live (from SDP content)
int64_t av_rescale(int64_t a, int64_t b, int64_t c)
Rescale a 64-bit integer with rounding to nearest.
#define RTSP_FLAG_CUSTOM_IO
Do all IO via the AVIOContext.
char control_url[1024]
url for this stream (from SDP)
int client_port_min
UDP client ports; these should be the local ports of the UDP RTP (and RTCP) sockets over which we rec...
@ RTSP_LOWER_TRANSPORT_UDP_MULTICAST
UDP/multicast.
void ffio_free_dyn_buf(AVIOContext **s)
Free a dynamic buffer.
int id
Format-specific stream ID.
static int read_packet(void *opaque, uint8_t *buf, int buf_size)
void * cur_transport_priv
RTSPStream->transport_priv of the last stream that we read a packet from.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
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 sdp_payload_type
payload type
int ff_wms_parse_sdp_a_line(AVFormatContext *s, const char *p)
Parse a Windows Media Server-specific SDP line.
int ff_rtp_chain_mux_open(AVFormatContext **out, AVFormatContext *s, AVStream *st, URLContext *handle, int packet_size, int idx)
#define RTP_MAX_PACKET_LENGTH
static void rtsp_parse_range_npt(const char *p, int64_t *start, int64_t *end)
Parse a string p in the form of Range:npt=xx-xx, and determine the start and end time.
struct sockaddr_storage sdp_ip
IP address (from SDP content)
int stale
Auth ok, but needs to be resent with a new nonce.
#define RTSP_DEFAULT_PORT
int index
stream index in AVFormatContext
@ RTSP_LOWER_TRANSPORT_HTTP
HTTP tunneled - not a proper transport mode as such, only for use via AVOptions.
This describes a single item in the "Transport:" line of one stream as negotiated by the SETUP RTSP c...
enum RTSPTransport transport
the negotiated data/packet transport protocol; e.g.
int ffurl_read(URLContext *h, unsigned char *buf, int size)
Read up to size bytes from the resource accessed by h, and store the read bytes in buf.
void avformat_free_context(AVFormatContext *s)
Free an AVFormatContext and all its streams.
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
int ffurl_write(URLContext *h, const unsigned char *buf, int size)
Write size bytes from buf to the resource accessed by h.
@ RTSP_SERVER_WMS
Windows Media server.
MpegTSContext * avpriv_mpegts_parse_open(AVFormatContext *s)
char * av_base64_encode(char *out, int out_size, const uint8_t *in, int in_size)
Encode data to base64 and null-terminate.
int stimeout
timeout of socket i/o operations.
@ RTSP_TRANSPORT_RAW
Raw data (over UDP)
#define RTSP_RTP_PORT_MAX
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.
HTTPAuthType
Authentication types, ordered from weakest to strongest.
#define AVIO_FLAG_READ
read-only
char * av_strdup(const char *s)
Duplicate a string.
@ RTSP_STATE_IDLE
not initialized
int auth_type
The currently chosen auth type.
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.
enum AVCodecID codec_id
Specific type of the encoded data (the codec used).
@ RTSP_LOWER_TRANSPORT_NB
void ff_rtp_parse_set_dynamic_protocol(RTPDemuxContext *s, PayloadContext *ctx, const RTPDynamicProtocolHandler *handler)
This structure stores compressed data.
enum RTSPServerType server_type
brand of server that we're talking to; e.g.
#define RTSP_DEFAULT_NB_AUDIO_CHANNELS
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
int accept_dynamic_rate
Whether the server accepts the x-Dynamic-Rate header.
#define flags(name, subs,...)
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 AVERROR_INVALIDDATA
Invalid data found when processing input.
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.
const char * ff_rtp_enc_name(int payload_type)
Return the encoding name (as defined in http://www.iana.org/assignments/rtp-parameters) for a given p...
#define AVERROR_EXIT
Immediate exit was requested; the called function should not be restarted.
static void get_word_until_chars(char *buf, int buf_size, const char *sep, const char **pp)
int ff_rtsp_connect(AVFormatContext *s)
Connect to the RTSP server and set up the individual media streams.
int port_min
UDP multicast port range; the ports to which we should connect to receive multicast UDP data.
#define RTSP_FLAG_FILTER_SRC
Filter incoming UDP packets - receive packets only from the right source address and port.
int avio_read_partial(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
int ffurl_get_file_handle(URLContext *h)
Return the file descriptor associated with this URL.
#define RTSPS_DEFAULT_PORT
@ RTSP_LOWER_TRANSPORT_UDP
UDP/unicast.
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
char * user_agent
User-Agent string.
#define RTSP_FLAG_RTCP_TO_SOURCE
Send RTCP packets to the source address of received packets.