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 */ | 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_PROTOCOL_RTP_UDP_MULTICAST: | |||||
| case RTSP_LOWER_TRANSPORT_UDP: | |||||
| 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; | ||||
| @@ -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) | |||||
| 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")) { | } 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 && | |||||
| (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); | url_close(rtsp_st->rtp_handle); | ||||
| rtsp_st->rtp_handle = NULL; | 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_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) | |||||
| 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 */ | /* 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); | |||||
| if (protocol_mask == 0 && err == 1) { | |||||
| lower_transport_mask &= ~(1 << lower_transport); | |||||
| 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_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)); | 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 | ||||
| @@ -25,14 +25,14 @@ | |||||
| #include "avformat.h" | #include "avformat.h" | ||||
| #include "rtspcodes.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. | * 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 { | ||||