[FFmpeg-devel] [PATCH] RTSP alternate protocol 1/3
Benoit Fouet
benoit.fouet
Mon Feb 11 14:20:55 CET 2008
Hi,
Ronald S. Bultje wrote:
> Hi,
>
> attached patch moves the REQUEST RTSP step into a new function
> (make_setup_request()). There's no functional changes. This is a requirement
> for [2-3]/3.
>
> Ronald
>
> ------------------------------------------------------------------------
>
> Index: ffmpeg/libavformat/rtsp.c
> ===================================================================
> --- ffmpeg.orig/libavformat/rtsp.c 2008-01-04 08:40:39.000000000 -0500
> +++ ffmpeg/libavformat/rtsp.c 2008-02-09 10:03:20.000000000 -0500
> @@ -844,78 +844,18 @@
> av_free(rt->rtsp_streams);
> }
>
> -static int rtsp_read_header(AVFormatContext *s,
> - AVFormatParameters *ap)
> +/**
> + * @returns 0 on success, <0 on error, 1 if protocol is unavailable.
> + */
> +static int
> +make_setup_request (AVFormatContext *s, const char *host, int port, int protocol)
> {
> RTSPState *rt = s->priv_data;
> - char host[1024], path[1024], tcpname[1024], cmd[2048], *option_list, *option;
> - URLContext *rtsp_hd;
> - int port, i, j, ret, err;
> - RTSPHeader reply1, *reply = &reply1;
> - unsigned char *content = NULL;
> + int j, i, err;
> RTSPStream *rtsp_st;
> - int protocol_mask = 0;
> AVStream *st;
> -
> - /* extract hostname and port */
> - url_split(NULL, 0, NULL, 0,
> - host, sizeof(host), &port, path, sizeof(path), s->filename);
> - if (port < 0)
> - port = RTSP_DEFAULT_PORT;
> -
> - /* search for options */
> - option_list = strchr(path, '?');
> - if (option_list) {
> - /* remove the options from the path */
> - *option_list++ = 0;
> - while(option_list) {
> - /* move the option pointer */
> - option = option_list;
> - option_list = strchr(option_list, '&');
> - if (option_list)
> - *(option_list++) = 0;
> - /* handle the options */
> - if (strcmp(option, "udp") == 0)
> - protocol_mask = (1<< RTSP_PROTOCOL_RTP_UDP);
> - else if (strcmp(option, "multicast") == 0)
> - protocol_mask = (1<< RTSP_PROTOCOL_RTP_UDP_MULTICAST);
> - else if (strcmp(option, "tcp") == 0)
> - protocol_mask = (1<< RTSP_PROTOCOL_RTP_TCP);
> - }
> - }
> -
> - if (!protocol_mask)
> - protocol_mask = rtsp_default_protocols;
> -
> - /* open the tcp connexion */
> - snprintf(tcpname, sizeof(tcpname), "tcp://%s:%d", host, port);
> - if (url_open(&rtsp_hd, tcpname, URL_RDWR) < 0)
> - return AVERROR(EIO);
> - rt->rtsp_hd = rtsp_hd;
> - rt->seq = 0;
> -
> - /* describe the stream */
> - snprintf(cmd, sizeof(cmd),
> - "DESCRIBE %s RTSP/1.0\r\n"
> - "Accept: application/sdp\r\n",
> - s->filename);
> - rtsp_send_cmd(s, cmd, reply, &content);
> - if (!content) {
> - err = AVERROR_INVALIDDATA;
> - goto fail;
> - }
> - if (reply->status_code != RTSP_STATUS_OK) {
> - err = AVERROR_INVALIDDATA;
> - goto fail;
> - }
> -
> - /* now we got the SDP description, we parse it */
> - ret = sdp_parse(s, (const char *)content);
> - av_freep(&content);
> - if (ret < 0) {
> - err = AVERROR_INVALIDDATA;
> - goto fail;
> - }
> + RTSPHeader reply1, *reply = &reply1;
> + char cmd[2048];
>
> /* for each stream, make the setup request */
> /* XXX: we assume the same server is used for the control of each
> @@ -930,7 +870,7 @@
> transport[0] = '\0';
>
> /* RTP/UDP */
> - if (protocol_mask & (1 << RTSP_PROTOCOL_RTP_UDP)) {
> + if (protocol & (1 << RTSP_PROTOCOL_RTP_UDP)) {
>
cosmetics (renaming could be done later)
> char buf[256];
>
> /* first try in specified port range */
> @@ -961,20 +901,25 @@
> }
>
> /* RTP/TCP */
> - else if (protocol_mask & (1 << RTSP_PROTOCOL_RTP_TCP)) {
> + else if (protocol & (1 << RTSP_PROTOCOL_RTP_TCP)) {
> if (transport[0] != '\0')
> av_strlcat(transport, ",", sizeof(transport));
> snprintf(transport + strlen(transport), sizeof(transport) - strlen(transport) - 1,
> "RTP/AVP/TCP");
> }
>
> - else if (protocol_mask & (1 << RTSP_PROTOCOL_RTP_UDP_MULTICAST)) {
> + else if (protocol & (1 << RTSP_PROTOCOL_RTP_UDP_MULTICAST)) {
> if (transport[0] != '\0')
> av_strlcat(transport, ",", sizeof(transport));
> snprintf(transport + strlen(transport),
> sizeof(transport) - strlen(transport) - 1,
> "RTP/AVP/UDP;multicast");
> + } else {
> + av_log(NULL, AV_LOG_ERROR, "Unknown protocol %d\n", protocol);
> + err = -1;
> + goto fail;
>
I think this is a functionnal change
(and maybe you could directly return from here, though I don't know what
is prefered)
> }
> +
>
cosmetics
--
Ben
Purple Labs S.A.
www.purplelabs.com
More information about the ffmpeg-devel
mailing list