Mercurial > libavformat.hg
comparison rtsp.c @ 4332:0d776969b708 libavformat
Fix the Transport: line in the SETUP request so that it works with WMS
servers when trying to set up a session over TCP:
- add the interleave property
- add unicast, only for WMS (since it is normally only UDP, but WMS expects it
for UDP and TCP)
- add mode=play
See discussion in "[PATCH] RTSP-MS 9/15: add interleave property to the TCP
transport line of the SETUP request" thread on mailinglist.
author | rbultje |
---|---|
date | Sun, 01 Feb 2009 13:37:45 +0000 |
parents | f49e5d92ab26 |
children | 3ae604db67e0 |
comparison
equal
deleted
inserted
replaced
4331:49c1d3b27727 | 4332:0d776969b708 |
---|---|
884 static int | 884 static int |
885 make_setup_request (AVFormatContext *s, const char *host, int port, | 885 make_setup_request (AVFormatContext *s, const char *host, int port, |
886 int lower_transport, const char *real_challenge) | 886 int lower_transport, const char *real_challenge) |
887 { | 887 { |
888 RTSPState *rt = s->priv_data; | 888 RTSPState *rt = s->priv_data; |
889 int j, i, err; | 889 int j, i, err, interleave = 0; |
890 RTSPStream *rtsp_st; | 890 RTSPStream *rtsp_st; |
891 RTSPHeader reply1, *reply = &reply1; | 891 RTSPHeader reply1, *reply = &reply1; |
892 char cmd[2048]; | 892 char cmd[2048]; |
893 const char *trans_pref; | 893 const char *trans_pref; |
894 | 894 |
941 } | 941 } |
942 | 942 |
943 /* RTP/TCP */ | 943 /* RTP/TCP */ |
944 else if (lower_transport == RTSP_LOWER_TRANSPORT_TCP) { | 944 else if (lower_transport == RTSP_LOWER_TRANSPORT_TCP) { |
945 snprintf(transport, sizeof(transport) - 1, | 945 snprintf(transport, sizeof(transport) - 1, |
946 "%s/TCP", trans_pref); | 946 "%s/TCP;", trans_pref); |
947 if (rt->server_type == RTSP_SERVER_WMS) | |
948 av_strlcat(transport, "unicast;", sizeof(transport)); | |
949 av_strlcatf(transport, sizeof(transport), | |
950 "interleaved=%d-%d", | |
951 interleave, interleave + 1); | |
952 interleave += 2; | |
947 } | 953 } |
948 | 954 |
949 else if (lower_transport == RTSP_LOWER_TRANSPORT_UDP_MULTICAST) { | 955 else if (lower_transport == RTSP_LOWER_TRANSPORT_UDP_MULTICAST) { |
950 snprintf(transport, sizeof(transport) - 1, | 956 snprintf(transport, sizeof(transport) - 1, |
951 "%s/UDP;multicast", trans_pref); | 957 "%s/UDP;multicast", trans_pref); |
952 } | 958 } |
953 if (rt->server_type == RTSP_SERVER_REAL) | 959 if (rt->server_type == RTSP_SERVER_REAL || |
960 rt->server_type == RTSP_SERVER_WMS) | |
954 av_strlcat(transport, ";mode=play", sizeof(transport)); | 961 av_strlcat(transport, ";mode=play", sizeof(transport)); |
955 snprintf(cmd, sizeof(cmd), | 962 snprintf(cmd, sizeof(cmd), |
956 "SETUP %s RTSP/1.0\r\n" | 963 "SETUP %s RTSP/1.0\r\n" |
957 "Transport: %s\r\n", | 964 "Transport: %s\r\n", |
958 rtsp_st->control_url, transport); | 965 rtsp_st->control_url, transport); |