[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