Rename RTSPProtocol to RTSPLowerTransport, so that its name properly tells us

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/trunk
This commit is contained in:
Ronald S. Bultje 2008-09-30 13:18:41 +00:00
parent e1a96237df
commit 90abbdba1e
3 changed files with 59 additions and 59 deletions

View File

@ -157,7 +157,7 @@ typedef struct HTTPContext {
int seq; /* RTSP sequence number */ int seq; /* RTSP sequence number */
/* RTP state specific */ /* RTP state specific */
enum RTSPProtocol rtp_protocol; enum RTSPLowerTransport rtp_protocol;
char session_id[32]; /* session id */ char session_id[32]; /* session id */
AVFormatContext *rtp_ctx[MAX_STREAMS]; AVFormatContext *rtp_ctx[MAX_STREAMS];
@ -278,7 +278,7 @@ static int prepare_sdp_description(FFStream *stream, uint8_t **pbuffer,
/* RTP handling */ /* RTP handling */
static HTTPContext *rtp_new_connection(struct sockaddr_in *from_addr, static HTTPContext *rtp_new_connection(struct sockaddr_in *from_addr,
FFStream *stream, const char *session_id, FFStream *stream, const char *session_id,
enum RTSPProtocol rtp_protocol); enum RTSPLowerTransport rtp_protocol);
static int rtp_new_av_stream(HTTPContext *c, static int rtp_new_av_stream(HTTPContext *c,
int stream_index, struct sockaddr_in *dest_addr, int stream_index, struct sockaddr_in *dest_addr,
HTTPContext *rtsp_c); HTTPContext *rtsp_c);
@ -509,7 +509,7 @@ static void start_multicast(void)
dest_addr.sin_port = htons(stream->multicast_port); dest_addr.sin_port = htons(stream->multicast_port);
rtp_c = rtp_new_connection(&dest_addr, stream, session_id, rtp_c = rtp_new_connection(&dest_addr, stream, session_id,
RTSP_PROTOCOL_RTP_UDP_MULTICAST); RTSP_LOWER_TRANSPORT_UDP_MULTICAST);
if (!rtp_c) if (!rtp_c)
continue; continue;
@ -2202,7 +2202,7 @@ static int http_prepare_data(HTTPContext *c)
if (c->is_packetized) { if (c->is_packetized) {
int max_packet_size; 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; max_packet_size = RTSP_TCP_MAX_PACKET_SIZE;
else else
max_packet_size = url_get_max_packet_size(c->rtp_handles[c->packet_stream_index]); 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) if (c->stream)
c->stream->bytes_served += len; 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 */ /* RTP packets are sent inside the RTSP TCP connection */
ByteIOContext *pb; ByteIOContext *pb;
int interleaved_index, size; int interleaved_index, size;
@ -2798,14 +2798,14 @@ static HTTPContext *find_rtp_session(const char *session_id)
return NULL; return NULL;
} }
static RTSPTransportField *find_transport(RTSPHeader *h, enum RTSPProtocol protocol) static RTSPTransportField *find_transport(RTSPHeader *h, enum RTSPLowerTransport lower_transport)
{ {
RTSPTransportField *th; RTSPTransportField *th;
int i; int i;
for(i=0;i<h->nb_transports;i++) { for(i=0;i<h->nb_transports;i++) {
th = &h->transports[i]; th = &h->transports[i];
if (th->protocol == protocol) if (th->lower_transport == lower_transport)
return th; return th;
} }
return NULL; return NULL;
@ -2867,9 +2867,9 @@ static void rtsp_cmd_setup(HTTPContext *c, const char *url,
rtp_c = find_rtp_session(h->session_id); rtp_c = find_rtp_session(h->session_id);
if (!rtp_c) { if (!rtp_c) {
/* always prefer UDP */ /* always prefer UDP */
th = find_transport(h, RTSP_PROTOCOL_RTP_UDP); th = find_transport(h, RTSP_LOWER_TRANSPORT_UDP);
if (!th) { if (!th) {
th = find_transport(h, RTSP_PROTOCOL_RTP_TCP); th = find_transport(h, RTSP_LOWER_TRANSPORT_TCP);
if (!th) { if (!th) {
rtsp_reply_error(c, RTSP_STATUS_TRANSPORT); rtsp_reply_error(c, RTSP_STATUS_TRANSPORT);
return; 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, rtp_c = rtp_new_connection(&c->from_addr, stream, h->session_id,
th->protocol); th->lower_transport);
if (!rtp_c) { if (!rtp_c) {
rtsp_reply_error(c, RTSP_STATUS_BANDWIDTH); rtsp_reply_error(c, RTSP_STATUS_BANDWIDTH);
return; return;
@ -2905,7 +2905,7 @@ static void rtsp_cmd_setup(HTTPContext *c, const char *url,
/* check transport */ /* check transport */
th = find_transport(h, rtp_c->rtp_protocol); 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)) { th->client_port_min <= 0)) {
rtsp_reply_error(c, RTSP_STATUS_TRANSPORT); rtsp_reply_error(c, RTSP_STATUS_TRANSPORT);
return; 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); url_fprintf(c->pb, "Session: %s\r\n", rtp_c->session_id);
switch(rtp_c->rtp_protocol) { 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]); port = rtp_get_local_port(rtp_c->rtp_handles[stream_index]);
url_fprintf(c->pb, "Transport: RTP/AVP/UDP;unicast;" url_fprintf(c->pb, "Transport: RTP/AVP/UDP;unicast;"
"client_port=%d-%d;server_port=%d-%d", "client_port=%d-%d;server_port=%d-%d",
th->client_port_min, th->client_port_min + 1, th->client_port_min, th->client_port_min + 1,
port, port + 1); port, port + 1);
break; break;
case RTSP_PROTOCOL_RTP_TCP: case RTSP_LOWER_TRANSPORT_TCP:
url_fprintf(c->pb, "Transport: RTP/AVP/TCP;interleaved=%d-%d", url_fprintf(c->pb, "Transport: RTP/AVP/TCP;interleaved=%d-%d",
stream_index * 2, stream_index * 2 + 1); stream_index * 2, stream_index * 2 + 1);
break; 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, static HTTPContext *rtp_new_connection(struct sockaddr_in *from_addr,
FFStream *stream, const char *session_id, FFStream *stream, const char *session_id,
enum RTSPProtocol rtp_protocol) enum RTSPLowerTransport rtp_protocol)
{ {
HTTPContext *c = NULL; HTTPContext *c = NULL;
const char *proto_str; const char *proto_str;
@ -3102,13 +3102,13 @@ static HTTPContext *rtp_new_connection(struct sockaddr_in *from_addr,
/* protocol is shown in statistics */ /* protocol is shown in statistics */
switch(c->rtp_protocol) { switch(c->rtp_protocol) {
case RTSP_PROTOCOL_RTP_UDP_MULTICAST: case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
proto_str = "MCAST"; proto_str = "MCAST";
break; break;
case RTSP_PROTOCOL_RTP_UDP: case RTSP_LOWER_TRANSPORT_UDP:
proto_str = "UDP"; proto_str = "UDP";
break; break;
case RTSP_PROTOCOL_RTP_TCP: case RTSP_LOWER_TRANSPORT_TCP:
proto_str = "TCP"; proto_str = "TCP";
break; break;
default: default:
@ -3172,8 +3172,8 @@ static int rtp_new_av_stream(HTTPContext *c,
ipaddr = inet_ntoa(dest_addr->sin_addr); ipaddr = inet_ntoa(dest_addr->sin_addr);
switch(c->rtp_protocol) { switch(c->rtp_protocol) {
case RTSP_PROTOCOL_RTP_UDP: case RTSP_LOWER_TRANSPORT_UDP:
case RTSP_PROTOCOL_RTP_UDP_MULTICAST: case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
/* RTP/UDP case */ /* RTP/UDP case */
/* XXX: also pass as parameter to function ? */ /* 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; c->rtp_handles[stream_index] = h;
max_packet_size = url_get_max_packet_size(h); max_packet_size = url_get_max_packet_size(h);
break; break;
case RTSP_PROTOCOL_RTP_TCP: case RTSP_LOWER_TRANSPORT_TCP:
/* RTP/TCP case */ /* RTP/TCP case */
c->rtsp_c = rtsp_c; c->rtsp_c = rtsp_c;
max_packet_size = RTSP_TCP_MAX_PACKET_SIZE; max_packet_size = RTSP_TCP_MAX_PACKET_SIZE;

View File

@ -63,7 +63,7 @@ typedef struct RTSPState {
// ByteIOContext rtsp_gb; // ByteIOContext rtsp_gb;
int seq; /* RTSP command sequence number */ int seq; /* RTSP command sequence number */
char session_id[512]; char session_id[512];
enum RTSPProtocol protocol; enum RTSPLowerTransport lower_transport;
enum RTSPServerType server_type; enum RTSPServerType server_type;
char last_reply[2048]; /* XXX: allocate ? */ char last_reply[2048]; /* XXX: allocate ? */
RTPDemuxContext *cur_rtp; RTPDemuxContext *cur_rtp;
@ -94,7 +94,7 @@ static int rtsp_read_play(AVFormatContext *s);
changing this variable */ changing this variable */
#if LIBAVFORMAT_VERSION_INT < (53 << 16) #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 #endif
static int rtsp_probe(AVProbeData *p) static int rtsp_probe(AVProbeData *p)
@ -643,9 +643,9 @@ static void rtsp_parse_transport(RTSPHeader *reply, const char *p)
profile[0] = '\0'; profile[0] = '\0';
} }
if (!strcasecmp(lower_transport, "TCP")) if (!strcasecmp(lower_transport, "TCP"))
th->protocol = RTSP_PROTOCOL_RTP_TCP; th->lower_transport = RTSP_LOWER_TRANSPORT_TCP;
else else
th->protocol = RTSP_PROTOCOL_RTP_UDP; th->lower_transport = RTSP_LOWER_TRANSPORT_UDP;
if (*p == ';') if (*p == ';')
p++; p++;
@ -676,8 +676,8 @@ static void rtsp_parse_transport(RTSPHeader *reply, const char *p)
&th->interleaved_max, &p); &th->interleaved_max, &p);
} }
} else if (!strcmp(parameter, "multicast")) { } else if (!strcmp(parameter, "multicast")) {
if (th->protocol == RTSP_PROTOCOL_RTP_UDP) if (th->lower_transport == RTSP_LOWER_TRANSPORT_UDP)
th->protocol = RTSP_PROTOCOL_RTP_UDP_MULTICAST; th->lower_transport = RTSP_LOWER_TRANSPORT_UDP_MULTICAST;
} else if (!strcmp(parameter, "ttl")) { } else if (!strcmp(parameter, "ttl")) {
if (*p == '=') { if (*p == '=') {
p++; p++;
@ -899,7 +899,7 @@ rtsp_open_transport_ctx(AVFormatContext *s, RTSPStream *rtsp_st)
*/ */
static int static int
make_setup_request (AVFormatContext *s, const char *host, int port, 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; RTSPState *rt = s->priv_data;
int j, i, err; int j, i, err;
@ -923,7 +923,7 @@ make_setup_request (AVFormatContext *s, const char *host, int port,
rtsp_st = rt->rtsp_streams[i]; rtsp_st = rt->rtsp_streams[i];
/* RTP/UDP */ /* RTP/UDP */
if (protocol == RTSP_PROTOCOL_RTP_UDP) { if (lower_transport == RTSP_LOWER_TRANSPORT_UDP) {
char buf[256]; char buf[256];
/* first try in specified port range */ /* first try in specified port range */
@ -954,12 +954,12 @@ make_setup_request (AVFormatContext *s, const char *host, int port,
} }
/* RTP/TCP */ /* RTP/TCP */
else if (protocol == RTSP_PROTOCOL_RTP_TCP) { else if (lower_transport == RTSP_LOWER_TRANSPORT_TCP) {
snprintf(transport, sizeof(transport) - 1, snprintf(transport, sizeof(transport) - 1,
"%s/TCP", trans_pref); "%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, snprintf(transport, sizeof(transport) - 1,
"%s/UDP;multicast", trans_pref); "%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 */ /* XXX: same protocol for all streams is required */
if (i > 0) { if (i > 0) {
if (reply->transports[0].protocol != rt->protocol) { if (reply->transports[0].lower_transport != rt->lower_transport) {
err = AVERROR_INVALIDDATA; err = AVERROR_INVALIDDATA;
goto fail; goto fail;
} }
} else { } else {
rt->protocol = reply->transports[0].protocol; rt->lower_transport = reply->transports[0].lower_transport;
} }
/* close RTP connection if not choosen */ /* close RTP connection if not choosen */
if (reply->transports[0].protocol != RTSP_PROTOCOL_RTP_UDP && if (reply->transports[0].lower_transport != RTSP_LOWER_TRANSPORT_UDP &&
(protocol == RTSP_PROTOCOL_RTP_UDP)) { (lower_transport == RTSP_LOWER_TRANSPORT_UDP)) {
url_close(rtsp_st->rtp_handle); url_close(rtsp_st->rtp_handle);
rtsp_st->rtp_handle = NULL; rtsp_st->rtp_handle = NULL;
} }
switch(reply->transports[0].protocol) { switch(reply->transports[0].lower_transport) {
case RTSP_PROTOCOL_RTP_TCP: case RTSP_LOWER_TRANSPORT_TCP:
rtsp_st->interleaved_min = reply->transports[0].interleaved_min; rtsp_st->interleaved_min = reply->transports[0].interleaved_min;
rtsp_st->interleaved_max = reply->transports[0].interleaved_max; rtsp_st->interleaved_max = reply->transports[0].interleaved_max;
break; break;
case RTSP_PROTOCOL_RTP_UDP: case RTSP_LOWER_TRANSPORT_UDP:
{ {
char url[1024]; char url[1024];
@ -1024,7 +1024,7 @@ make_setup_request (AVFormatContext *s, const char *host, int port,
} }
} }
break; break;
case RTSP_PROTOCOL_RTP_UDP_MULTICAST: case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
{ {
char url[1024]; char url[1024];
struct in_addr in; struct in_addr in;
@ -1070,7 +1070,7 @@ static int rtsp_read_header(AVFormatContext *s,
int port, ret, err; int port, ret, err;
RTSPHeader reply1, *reply = &reply1; RTSPHeader reply1, *reply = &reply1;
unsigned char *content = NULL; unsigned char *content = NULL;
int protocol_mask = 0; int lower_transport_mask = 0;
char real_challenge[64]; char real_challenge[64];
/* extract hostname and port */ /* extract hostname and port */
@ -1092,16 +1092,16 @@ static int rtsp_read_header(AVFormatContext *s,
*(option_list++) = 0; *(option_list++) = 0;
/* handle the options */ /* handle the options */
if (strcmp(option, "udp") == 0) 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) 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) else if (strcmp(option, "tcp") == 0)
protocol_mask = (1<< RTSP_PROTOCOL_RTP_TCP); lower_transport_mask = (1<< RTSP_LOWER_TRANSPORT_TCP);
} }
} }
if (!protocol_mask) if (!lower_transport_mask)
protocol_mask = (1 << RTSP_PROTOCOL_RTP_LAST) - 1; lower_transport_mask = (1 << RTSP_LOWER_TRANSPORT_LAST) - 1;
/* open the tcp connexion */ /* open the tcp connexion */
snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port); snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port);
@ -1179,15 +1179,15 @@ static int rtsp_read_header(AVFormatContext *s,
} }
do { 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 ? rt->server_type == RTSP_SERVER_REAL ?
real_challenge : NULL); real_challenge : NULL);
if (err < 0) if (err < 0)
goto fail; goto fail;
protocol_mask &= ~(1 << protocol); lower_transport_mask &= ~(1 << lower_transport);
if (protocol_mask == 0 && err == 1) { if (lower_transport_mask == 0 && err == 1) {
err = AVERROR(FF_NETERROR(EPROTONOSUPPORT)); err = AVERROR(FF_NETERROR(EPROTONOSUPPORT));
goto fail; goto fail;
} }
@ -1353,13 +1353,13 @@ static int rtsp_read_packet(AVFormatContext *s,
/* read next RTP packet */ /* read next RTP packet */
redo: redo:
switch(rt->protocol) { switch(rt->lower_transport) {
default: default:
case RTSP_PROTOCOL_RTP_TCP: case RTSP_LOWER_TRANSPORT_TCP:
len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf)); len = tcp_read_packet(s, &rtsp_st, buf, sizeof(buf));
break; break;
case RTSP_PROTOCOL_RTP_UDP: case RTSP_LOWER_TRANSPORT_UDP:
case RTSP_PROTOCOL_RTP_UDP_MULTICAST: case RTSP_LOWER_TRANSPORT_UDP_MULTICAST:
len = udp_read_packet(s, &rtsp_st, buf, sizeof(buf)); len = udp_read_packet(s, &rtsp_st, buf, sizeof(buf));
if (len >=0 && rtsp_st->rtp_ctx) if (len >=0 && rtsp_st->rtp_ctx)
rtp_check_and_send_back_rr(rtsp_st->rtp_ctx, len); rtp_check_and_send_back_rr(rtsp_st->rtp_ctx, len);
@ -1462,7 +1462,7 @@ static int rtsp_read_close(AVFormatContext *s)
#if 0 #if 0
/* NOTE: it is valid to flush the buffer here */ /* 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); url_fclose(&rt->rtsp_gb);
} }
#endif #endif

View File

@ -25,14 +25,14 @@
#include "avformat.h" #include "avformat.h"
#include "rtspcodes.h" #include "rtspcodes.h"
enum RTSPProtocol { enum RTSPLowerTransport {
RTSP_PROTOCOL_RTP_UDP = 0, RTSP_LOWER_TRANSPORT_UDP = 0,
RTSP_PROTOCOL_RTP_TCP = 1, RTSP_LOWER_TRANSPORT_TCP = 1,
RTSP_PROTOCOL_RTP_UDP_MULTICAST = 2, RTSP_LOWER_TRANSPORT_UDP_MULTICAST = 2,
/** /**
* This is not part of public API and shouldn't be used outside of ffmpeg. * 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 #define RTSP_DEFAULT_PORT 554
@ -50,7 +50,7 @@ typedef struct RTSPTransportField {
int server_port_min, server_port_max; /**< RTP ports */ int server_port_min, server_port_max; /**< RTP ports */
int ttl; /**< ttl value */ int ttl; /**< ttl value */
uint32_t destination; /**< destination IP address */ uint32_t destination; /**< destination IP address */
enum RTSPProtocol protocol; enum RTSPLowerTransport lower_transport;
} RTSPTransportField; } RTSPTransportField;
typedef struct RTSPHeader { typedef struct RTSPHeader {