that it only describes the lower-level transport (TCP vs. UDP) and not the actual data layout (e.g. RDT vs. RTP). See discussion in "Realmedia patch" thread on ML. Originally committed as revision 15481 to svn://svn.ffmpeg.org/ffmpeg/trunktags/v0.5
@@ -157,7 +157,7 @@ typedef struct HTTPContext { | |||
int seq; /* RTSP sequence number */ | |||
/* RTP state specific */ | |||
enum RTSPProtocol rtp_protocol; | |||
enum RTSPLowerTransport rtp_protocol; | |||
char session_id[32]; /* session id */ | |||
AVFormatContext *rtp_ctx[MAX_STREAMS]; | |||
@@ -278,7 +278,7 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer, | |||
/* RTP handling */ | |||
static HTTPContext *rtp_new_connection(struct sockaddr_in *from_addr, | |||
FFStream *stream, const char *session_id, | |||
enum RTSPProtocol rtp_protocol); | |||
enum RTSPLowerTransport rtp_protocol); | |||
static int rtp_new_av_stream(HTTPContext *c, | |||
int stream_index, struct sockaddr_in *dest_addr, | |||
HTTPContext *rtsp_c); | |||
@@ -509,7 +509,7 @@ static void start_multicast(void) | |||
dest_addr.sin_port = htons(stream->multicast_port); | |||
rtp_c = rtp_new_connection(&dest_addr, stream, session_id, | |||
RTSP_PROTOCOL_RTP_UDP_MULTICAST); | |||
RTSP_LOWER_TRANSPORT_UDP_MULTICAST); | |||
if (!rtp_c) | |||
continue; | |||
@@ -2202,7 +2202,7 @@ static int http_prepare_data(HTTPContext *c) | |||
if (c->is_packetized) { | |||
int max_packet_size; | |||
if (c->rtp_protocol == RTSP_PROTOCOL_RTP_TCP) | |||
if (c->rtp_protocol == RTSP_LOWER_TRANSPORT_TCP) | |||
max_packet_size = RTSP_TCP_MAX_PACKET_SIZE; | |||
else | |||
max_packet_size = url_get_max_packet_size(c->rtp_handles[c->packet_stream_index]); | |||
@@ -2306,7 +2306,7 @@ static int http_send_data(HTTPContext *c) | |||
if (c->stream) | |||
c->stream->bytes_served += len; | |||
if (c->rtp_protocol == RTSP_PROTOCOL_RTP_TCP) { | |||
if (c->rtp_protocol == RTSP_LOWER_TRANSPORT_TCP) { | |||
/* RTP packets are sent inside the RTSP TCP connection */ | |||
ByteIOContext *pb; | |||
int interleaved_index, size; | |||
@@ -2798,14 +2798,14 @@ static HTTPContext *find_rtp_session(const char *session_id) | |||
return NULL; | |||
} | |||
static RTSPTransportField *find_transport(RTSPHeader *h, enum RTSPProtocol protocol) | |||
static RTSPTransportField *find_transport(RTSPHeader *h, enum RTSPLowerTransport lower_transport) | |||
{ | |||
RTSPTransportField *th; | |||
int i; | |||
for(i=0;i<h->nb_transports;i++) { | |||
th = &h->transports[i]; | |||
if (th->protocol == protocol) | |||
if (th->lower_transport == lower_transport) | |||
return th; | |||
} | |||
return NULL; | |||
@@ -2867,9 +2867,9 @@ static void rtsp_cmd_setup(HTTPContext *c, const char *url, | |||
rtp_c = find_rtp_session(h->session_id); | |||
if (!rtp_c) { | |||
/* always prefer UDP */ | |||
th = find_transport(h, RTSP_PROTOCOL_RTP_UDP); | |||
th = find_transport(h, RTSP_LOWER_TRANSPORT_UDP); | |||
if (!th) { | |||
th = find_transport(h, RTSP_PROTOCOL_RTP_TCP); | |||
th = find_transport(h, RTSP_LOWER_TRANSPORT_TCP); | |||
if (!th) { | |||
rtsp_reply_error(c, RTSP_STATUS_TRANSPORT); | |||
return; | |||
@@ -2877,7 +2877,7 @@ static void rtsp_cmd_setup(HTTPContext *c, const char *url, | |||
} | |||
rtp_c = rtp_new_connection(&c->from_addr, stream, h->session_id, | |||
th->protocol); | |||
th->lower_transport); | |||
if (!rtp_c) { | |||
rtsp_reply_error(c, RTSP_STATUS_BANDWIDTH); | |||
return; | |||
@@ -2905,7 +2905,7 @@ static void rtsp_cmd_setup(HTTPContext *c, const char *url, | |||
/* check transport */ | |||
th = find_transport(h, rtp_c->rtp_protocol); | |||
if (!th || (th->protocol == RTSP_PROTOCOL_RTP_UDP && | |||
if (!th || (th->lower_transport == RTSP_LOWER_TRANSPORT_UDP && | |||
th->client_port_min <= 0)) { | |||
rtsp_reply_error(c, RTSP_STATUS_TRANSPORT); | |||
return; | |||
@@ -2928,14 +2928,14 @@ static void rtsp_cmd_setup(HTTPContext *c, const char *url, | |||
url_fprintf(c->pb, "Session: %s\r\n", rtp_c->session_id); | |||
switch(rtp_c->rtp_protocol) { | |||
case RTSP_PROTOCOL_RTP_UDP: | |||
case RTSP_LOWER_TRANSPORT_UDP: | |||
port = rtp_get_local_port(rtp_c->rtp_handles[stream_index]); | |||
url_fprintf(c->pb, "Transport: RTP/AVP/UDP;unicast;" | |||
"client_port=%d-%d;server_port=%d-%d", | |||
th->client_port_min, th->client_port_min + 1, | |||
port, port + 1); | |||
break; | |||
case RTSP_PROTOCOL_RTP_TCP: | |||
case RTSP_LOWER_TRANSPORT_TCP: | |||
url_fprintf(c->pb, "Transport: RTP/AVP/TCP;interleaved=%d-%d", | |||
stream_index * 2, stream_index * 2 + 1); | |||
break; | |||
@@ -3071,7 +3071,7 @@ static void rtsp_cmd_teardown(HTTPContext *c, const char *url, RTSPHeader *h) | |||
static HTTPContext *rtp_new_connection(struct sockaddr_in *from_addr, | |||
FFStream *stream, const char *session_id, | |||
enum RTSPProtocol rtp_protocol) | |||
enum RTSPLowerTransport rtp_protocol) | |||
{ | |||
HTTPContext *c = NULL; | |||
const char *proto_str; | |||
@@ -3102,13 +3102,13 @@ static HTTPContext *rtp_new_connection(struct sockaddr_in *from_addr, | |||
/* protocol is shown in statistics */ | |||
switch(c->rtp_protocol) { | |||
case RTSP_PROTOCOL_RTP_UDP_MULTICAST: | |||
case RTSP_LOWER_TRANSPORT_UDP_MULTICAST: | |||
proto_str = "MCAST"; | |||
break; | |||
case RTSP_PROTOCOL_RTP_UDP: | |||
case RTSP_LOWER_TRANSPORT_UDP: | |||
proto_str = "UDP"; | |||
break; | |||
case RTSP_PROTOCOL_RTP_TCP: | |||
case RTSP_LOWER_TRANSPORT_TCP: | |||
proto_str = "TCP"; | |||
break; | |||
default: | |||
@@ -3172,8 +3172,8 @@ static int rtp_new_av_stream(HTTPContext *c, | |||
ipaddr = inet_ntoa(dest_addr->sin_addr); | |||
switch(c->rtp_protocol) { | |||
case RTSP_PROTOCOL_RTP_UDP: | |||
case RTSP_PROTOCOL_RTP_UDP_MULTICAST: | |||
case RTSP_LOWER_TRANSPORT_UDP: | |||
case RTSP_LOWER_TRANSPORT_UDP_MULTICAST: | |||
/* RTP/UDP case */ | |||
/* XXX: also pass as parameter to function ? */ | |||
@@ -3195,7 +3195,7 @@ static int rtp_new_av_stream(HTTPContext *c, | |||
c->rtp_handles[stream_index] = h; | |||
max_packet_size = url_get_max_packet_size(h); | |||
break; | |||
case RTSP_PROTOCOL_RTP_TCP: | |||
case RTSP_LOWER_TRANSPORT_TCP: | |||
/* RTP/TCP case */ | |||
c->rtsp_c = rtsp_c; | |||
max_packet_size = RTSP_TCP_MAX_PACKET_SIZE; | |||
@@ -63,7 +63,7 @@ typedef struct RTSPState { | |||
// ByteIOContext rtsp_gb; | |||
int seq; /* RTSP command sequence number */ | |||
char session_id[512]; | |||
enum RTSPProtocol protocol; | |||
enum RTSPLowerTransport lower_transport; | |||
enum RTSPServerType server_type; | |||
char last_reply[2048]; /* XXX: allocate ? */ | |||
RTPDemuxContext *cur_rtp; | |||
@@ -94,7 +94,7 @@ static int rtsp_read_play(AVFormatContext *s); | |||
changing this variable */ | |||
#if LIBAVFORMAT_VERSION_INT < (53 << 16) | |||
int rtsp_default_protocols = (1 << RTSP_PROTOCOL_RTP_UDP); | |||
int rtsp_default_protocols = (1 << RTSP_LOWER_TRANSPORT_UDP); | |||
#endif | |||
static int rtsp_probe(AVProbeData *p) | |||
@@ -643,9 +643,9 @@ static void rtsp_parse_transport(RTSPHeader *reply, const char *p) | |||
profile[0] = '\0'; | |||
} | |||
if (!strcasecmp(lower_transport, "TCP")) | |||
th->protocol = RTSP_PROTOCOL_RTP_TCP; | |||
th->lower_transport = RTSP_LOWER_TRANSPORT_TCP; | |||
else | |||
th->protocol = RTSP_PROTOCOL_RTP_UDP; | |||
th->lower_transport = RTSP_LOWER_TRANSPORT_UDP; | |||
if (*p == ';') | |||
p++; | |||
@@ -676,8 +676,8 @@ static void rtsp_parse_transport(RTSPHeader *reply, const char *p) | |||
&th->interleaved_max, &p); | |||
} | |||
} else if (!strcmp(parameter, "multicast")) { | |||
if (th->protocol == RTSP_PROTOCOL_RTP_UDP) | |||
th->protocol = RTSP_PROTOCOL_RTP_UDP_MULTICAST; | |||
if (th->lower_transport == RTSP_LOWER_TRANSPORT_UDP) | |||
th->lower_transport = RTSP_LOWER_TRANSPORT_UDP_MULTICAST; | |||
} else if (!strcmp(parameter, "ttl")) { | |||
if (*p == '=') { | |||
p++; | |||
@@ -899,7 +899,7 @@ rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st) | |||
*/ | |||
static int | |||
make_setup_request (AVFormatContext *s, const char *host, int port, | |||
int protocol, const char *real_challenge) | |||
int lower_transport, const char *real_challenge) | |||
{ | |||
RTSPState *rt = s->priv_data; | |||
int j, i, err; | |||
@@ -923,7 +923,7 @@ make_setup_request (AVFormatContext *s, const char *host, int port, | |||
rtsp_st = rt->rtsp_streams[i]; | |||
/* RTP/UDP */ | |||
if (protocol == RTSP_PROTOCOL_RTP_UDP) { | |||
if (lower_transport == RTSP_LOWER_TRANSPORT_UDP) { | |||
char buf[256]; | |||
/* first try in specified port range */ | |||
@@ -954,12 +954,12 @@ make_setup_request (AVFormatContext *s, const char *host, int port, | |||
} | |||
/* RTP/TCP */ | |||
else if (protocol == RTSP_PROTOCOL_RTP_TCP) { | |||
else if (lower_transport == RTSP_LOWER_TRANSPORT_TCP) { | |||
snprintf(transport, sizeof(transport) - 1, | |||
"%s/TCP", trans_pref); | |||
} | |||
else if (protocol == RTSP_PROTOCOL_RTP_UDP_MULTICAST) { | |||
else if (lower_transport == RTSP_LOWER_TRANSPORT_UDP_MULTICAST) { | |||
snprintf(transport, sizeof(transport) - 1, | |||
"%s/UDP;multicast", trans_pref); | |||
} | |||
@@ -990,28 +990,28 @@ make_setup_request (AVFormatContext *s, const char *host, int port, | |||
/* XXX: same protocol for all streams is required */ | |||
if (i > 0) { | |||
if (reply->transports[0].protocol != rt->protocol) { | |||
if (reply->transports[0].lower_transport != rt->lower_transport) { | |||
err = AVERROR_INVALIDDATA; | |||
goto fail; | |||
} | |||
} else { | |||
rt->protocol = reply->transports[0].protocol; | |||
rt->lower_transport = reply->transports[0].lower_transport; | |||
} | |||
/* close RTP connection if not choosen */ | |||
if (reply->transports[0].protocol != RTSP_PROTOCOL_RTP_UDP && | |||
(protocol == RTSP_PROTOCOL_RTP_UDP)) { | |||
if (reply->transports[0].lower_transport != RTSP_LOWER_TRANSPORT_UDP && | |||
(lower_transport == RTSP_LOWER_TRANSPORT_UDP)) { | |||
url_close(rtsp_st->rtp_handle); | |||
rtsp_st->rtp_handle = NULL; | |||
} | |||
switch(reply->transports[0].protocol) { | |||
case RTSP_PROTOCOL_RTP_TCP: | |||
switch(reply->transports[0].lower_transport) { | |||
case RTSP_LOWER_TRANSPORT_TCP: | |||
rtsp_st->interleaved_min = reply->transports[0].interleaved_min; | |||
rtsp_st->interleaved_max = reply->transports[0].interleaved_max; | |||
break; | |||
case RTSP_PROTOCOL_RTP_UDP: | |||
case RTSP_LOWER_TRANSPORT_UDP: | |||
{ | |||
char url[1024]; | |||
@@ -1024,7 +1024,7 @@ make_setup_request (AVFormatContext *s, const char *host, int port, | |||
} | |||
} | |||
break; | |||
case RTSP_PROTOCOL_RTP_UDP_MULTICAST: | |||
case RTSP_LOWER_TRANSPORT_UDP_MULTICAST: | |||
{ | |||
char url[1024]; | |||
struct in_addr in; | |||
@@ -1070,7 +1070,7 @@ static int rtsp_read_header(AVFormatContext *s, | |||
int port, ret, err; | |||
RTSPHeader reply1, *reply = &reply1; | |||
unsigned char *content = NULL; | |||
int protocol_mask = 0; | |||
int lower_transport_mask = 0; | |||
char real_challenge[64]; | |||
/* extract hostname and port */ | |||
@@ -1092,16 +1092,16 @@ static int rtsp_read_header(AVFormatContext *s, | |||
*(option_list++) = 0; | |||
/* handle the options */ | |||
if (strcmp(option, "udp") == 0) | |||
protocol_mask = (1<< RTSP_PROTOCOL_RTP_UDP); | |||
lower_transport_mask = (1<< RTSP_LOWER_TRANSPORT_UDP); | |||
else if (strcmp(option, "multicast") == 0) | |||
protocol_mask = (1<< RTSP_PROTOCOL_RTP_UDP_MULTICAST); | |||
lower_transport_mask = (1<< RTSP_LOWER_TRANSPORT_UDP_MULTICAST); | |||
else if (strcmp(option, "tcp") == 0) | |||
protocol_mask = (1<< RTSP_PROTOCOL_RTP_TCP); | |||
lower_transport_mask = (1<< RTSP_LOWER_TRANSPORT_TCP); | |||
} | |||
} | |||
if (!protocol_mask) | |||
protocol_mask = (1 << RTSP_PROTOCOL_RTP_LAST) - 1; | |||
if (!lower_transport_mask) | |||
lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_LAST) - 1; | |||
/* open the tcp connexion */ | |||
snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port); | |||
@@ -1179,15 +1179,15 @@ static int rtsp_read_header(AVFormatContext *s, | |||
} | |||
do { | |||
int protocol = ff_log2_tab[protocol_mask & ~(protocol_mask - 1)]; | |||
int lower_transport = ff_log2_tab[lower_transport_mask & ~(lower_transport_mask - 1)]; | |||
err = make_setup_request(s, host, port, protocol, | |||
err = make_setup_request(s, host, port, lower_transport, | |||
rt->server_type == RTSP_SERVER_REAL ? | |||
real_challenge : NULL); | |||
if (err < 0) | |||
goto fail; | |||
protocol_mask &= ~(1 << protocol); | |||
if (protocol_mask == 0 && err == 1) { | |||
lower_transport_mask &= ~(1 << lower_transport); | |||
if (lower_transport_mask == 0 && err == 1) { | |||
err = AVERROR(FF_NETERROR(EPROTONOSUPPORT)); | |||
goto fail; | |||
} | |||
@@ -1353,13 +1353,13 @@ static int rtsp_read_packet(AVFormatContext *s, | |||
/* read next RTP packet */ | |||
redo: | |||
switch(rt->protocol) { | |||
switch(rt->lower_transport) { | |||
default: | |||
case RTSP_PROTOCOL_RTP_TCP: | |||
case RTSP_LOWER_TRANSPORT_TCP: | |||
len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf)); | |||
break; | |||
case RTSP_PROTOCOL_RTP_UDP: | |||
case RTSP_PROTOCOL_RTP_UDP_MULTICAST: | |||
case RTSP_LOWER_TRANSPORT_UDP: | |||
case RTSP_LOWER_TRANSPORT_UDP_MULTICAST: | |||
len = udp_read_packet(s, &rtsp_st, buf, sizeof(buf)); | |||
if (len >=0 && rtsp_st->rtp_ctx) | |||
rtp_check_and_send_back_rr(rtsp_st->rtp_ctx, len); | |||
@@ -1462,7 +1462,7 @@ static int rtsp_read_close(AVFormatContext *s) | |||
#if 0 | |||
/* NOTE: it is valid to flush the buffer here */ | |||
if (rt->protocol == RTSP_PROTOCOL_RTP_TCP) { | |||
if (rt->lower_transport == RTSP_LOWER_TRANSPORT_TCP) { | |||
url_fclose(&rt->rtsp_gb); | |||
} | |||
#endif | |||
@@ -25,14 +25,14 @@ | |||
#include "avformat.h" | |||
#include "rtspcodes.h" | |||
enum RTSPProtocol { | |||
RTSP_PROTOCOL_RTP_UDP = 0, | |||
RTSP_PROTOCOL_RTP_TCP = 1, | |||
RTSP_PROTOCOL_RTP_UDP_MULTICAST = 2, | |||
enum RTSPLowerTransport { | |||
RTSP_LOWER_TRANSPORT_UDP = 0, | |||
RTSP_LOWER_TRANSPORT_TCP = 1, | |||
RTSP_LOWER_TRANSPORT_UDP_MULTICAST = 2, | |||
/** | |||
* This is not part of public API and shouldn't be used outside of ffmpeg. | |||
*/ | |||
RTSP_PROTOCOL_RTP_LAST | |||
RTSP_LOWER_TRANSPORT_LAST | |||
}; | |||
#define RTSP_DEFAULT_PORT 554 | |||
@@ -50,7 +50,7 @@ typedef struct RTSPTransportField { | |||
int server_port_min, server_port_max; /**< RTP ports */ | |||
int ttl; /**< ttl value */ | |||
uint32_t destination; /**< destination IP address */ | |||
enum RTSPProtocol protocol; | |||
enum RTSPLowerTransport lower_transport; | |||
} RTSPTransportField; | |||
typedef struct RTSPHeader { | |||