[FFmpeg-devel] Unix "fileno" libavformat module

Benoit Fouet benoit.fouet
Tue Jul 10 17:24:08 CEST 2007


Hi,

William Ahern wrote:
> On Tue, Jul 10, 2007 at 11:44:30AM +0200, Diego Biurrun wrote:
>   
>> On Mon, Jul 09, 2007 at 06:13:20PM -0700, William Ahern wrote:
>>     
>>> On Mon, Jul 09, 2007 at 06:05:58PM -0700, William Ahern wrote:
>>> <snip> 
>>>       
>>>> Also, I put an LGPL 3 header on this file. I don't mean to start anything;
>>>> just let me know if I need to use an LGPL 2 header.
>>>>         
>>> Ouch. I'm just now reading the long thread, "GPL version matter". Please
>>> don't yell at me ;)
>>>       
>> I was about to.  Resubmit this with the default header we use please.
>>
>>     
>
> Attached is a proper patch against a checkout from earlier today (by GMT).
> I've added the requested license header and replaced my 8-column aligned
> tabs with 4-column aligned spaces (*shudder*). The altered build and header
> files are included, as well.
>
>   
> ------------------------------------------------------------------------
>
> Index: ffmpeg/libavformat/Makefile
> ===================================================================
> --- ffmpeg/libavformat/Makefile	(revision 1323)
> +++ ffmpeg/libavformat/Makefile	(revision 1326)
> @@ -169,6 +169,7 @@
>  OBJS-$(CONFIG_RTP_PROTOCOL)              += rtpproto.o
>  OBJS-$(CONFIG_TCP_PROTOCOL)              += tcp.o
>  OBJS-$(CONFIG_UDP_PROTOCOL)              += udp.o
> +OBJS-$(CONFIG_FILENO_PROTOCOL)           += fileno.o
>  
>  NAME=avformat
>  LIBVERSION=$(LAVFVERSION)
> Index: ffmpeg/libavformat/avio.h
> ===================================================================
> --- ffmpeg/libavformat/avio.h	(revision 1323)
> +++ ffmpeg/libavformat/avio.h	(revision 1326)
> @@ -270,5 +270,8 @@
>  /* http.c */
>  extern URLProtocol http_protocol;
>  
> +/* fileno.c */
> +extern URLProtocol fileno_protocol;
> +
>  #endif
>  
> Index: ffmpeg/libavformat/fileno.c
> ===================================================================
> --- ffmpeg/libavformat/fileno.c	(revision 0)
> +++ ffmpeg/libavformat/fileno.c	(revision 1326)
> @@ -0,0 +1,181 @@
> +/*
> + * Unix "fileno" I/O handler for libavformat.
> + *
> + * Copyright (c) 2007 RemoTV, Inc. (William Ahern <wahern at remotv.com>)
> + *
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +#if FILENO_DEBUG
>   

please break a line between header and your #if

> +#include <stdio.h>	/* stderr fputs(3) fprintf(3) */
>   

tabs are forbidden

> +#endif
> +
> +#include <stddef.h>	/* NULL */
> +#include <stdlib.h>	/* strtoul(3) */
> +
> +#include <limits.h>	/* INT_MAX ULONG_MAX */ 
>   

trailing whitespace (and tabs)

> +
> +#include <errno.h>	/* ENOMEM EINVAL ERANGE */
> +
>   

see AVERROR()

> +#include <string.h>	/* strncmp(3) */
> +
> +#include <sys/param.h>	/* MIN */
> +
>   

see FFMIN

> +#include <unistd.h>	/* read(2) write(2) close(2) */
> +
> +#include "avformat.h"
> +
> +
> +#if FILENO_DEBUG
> +#define MARK	fprintf(stderr, "@@ %d\n", __LINE__)
> +#endif
> +
> +
> +#define BUF_RLEN(b)	((b)->w.pos - (b)->r.pos)
> +#define BUF_WLEN(b)	((b)->end - (b)->w.pos)
> +
>   

more tabs

> +typedef struct {
> +    int fd;
> +
> +    struct {
> +        unsigned char base[65536];
> +
>   

can't this one be dynamically allocated ?

> +        struct {
> +            unsigned char *pos;
> +        } r, w;
> +
> +        unsigned char *end;
> +    } rbuf;
> +} FilenoContext;
> +
> +
> +static int fileno_open(URLContext *h, const char *uri, int flags) {
> +    FilenoContext *s;
> +    struct { const char *pos; char *end; } src;
> +    unsigned long lu;
> +
> +    if (0 == (s = av_malloc(sizeof *s)))
> +        return -ENOMEM;
> +
> +    s->rbuf.end = &s->rbuf.base[sizeof s->rbuf.base];
> +    s->rbuf.r.pos = s->rbuf.base;
> +    s->rbuf.w.pos = s->rbuf.base;
> +
> +    h->priv_data = s;
> +
> +    if (0 != strncmp(uri, "fileno://", sizeof "fileno://" - 1))
> +        return -EINVAL;
>   

mem leak

> +
> +    src.pos = uri + sizeof "fileno://" - 1;
> +
> +    lu = strtoul(src.pos, &src.end, 10);
> +
> +    if ((lu == ULONG_MAX && errno == ERANGE) || lu > INT_MAX)
> +        return -EINVAL;
> +
>   

mem leak

> +    s->fd = lu;
> +
> +    return 0;
> +} /* fileno_open() */
> +
> +
> +static int fileno_read(URLContext *h, uint8_t *buf, int size) {
> +    FilenoContext *s = h->priv_data;
> +    int n;
> +
> +retry:
> +    /* Read from buffer. */
> +    if (BUF_RLEN(&s->rbuf) > 0) {
> +        size = MIN(size, BUF_RLEN(&s->rbuf));
> +
>   

FFMIN

> +        (void)memcpy(buf, s->rbuf.r.pos, size);
>   

why this cast ?

> +        s->rbuf.r.pos += size;
> +
> +        return size;
> +    }
> +
> +    /* Fill buffer. */
> +    if  (BUF_WLEN(&s->rbuf) > 0) {
> +        n = read(s->fd, s->rbuf.w.pos, BUF_WLEN(&s->rbuf));
> +
> +        if (n <= 0)
> +            return n;
> +
> +        s->rbuf.w.pos += n;
> +
> +        goto retry;
> +    }
> +
> +    /* We've shot past our ability to buffer. Do raw I/O, now. */
> +    return read(s->fd, buf, size);
> +} /* fileno_read() */
> +
> +
> +static int fileno_write(URLContext *h, uint8_t *buf, int size) {
> +    FilenoContext *s = h->priv_data;
> +
> +    return write(s->fd, buf, size);
> +} /* fileno_write() */
> +
> +
> +static offset_t fileno_seek(URLContext *h, offset_t off, int whence) {
> +#if FILENO_DEBUG
> +    const char *how[] = {
> +        [SEEK_SET]	= "SEEK_SET",
> +        [SEEK_CUR]	= "SEEK_CUR",
> +        [SEEK_END]	= "SEEK_END",
> +        [AVSEEK_SIZE]	= "AVSEEK_SIZE",
> +    };
>   

tabs

> +#endif
> +
> +    FilenoContext *s = h->priv_data;
> +
> +    if (whence == AVSEEK_SIZE)
> +        return -1;
> +    if (whence == SEEK_CUR || whence == SEEK_END)
> +        return -1;
> +    if (BUF_WLEN(&s->rbuf) == 0 && BUF_RLEN(&s->rbuf) == 0)
> +        return -1;    /* We've already read too far. */
> +    if (off > sizeof s->rbuf.base || off > (s->rbuf.w.pos - s->rbuf.base))
> +        return -1;    /* We can't seek past the buffer (or can we?). */
> +    if (off < -1)
> +        return -1;    /* But they specified "SEEK_SET". */
> +
> +    s->rbuf.r.pos = s->rbuf.base + off;
> +
> +    return 0;
> +} /* fileno_seek() */
> +
> +
> +static int fileno_close(URLContext *h) {
> +    FilenoContext *s = h->priv_data;
> +
> +    (void)close(s->fd);
> +
>   

why this cast ?

> +    av_free(s);
> +
> +    return 0;
> +} /* fileno_close() */
> +
> +
> +URLProtocol fileno_protocol = {
> +    "fileno",
> +    fileno_open,
> +    fileno_read,
> +    fileno_write,
> +    fileno_seek,
> +    fileno_close,
> +}; /* fileno_protocol */
> Index: ffmpeg/libavformat/allformats.c
> ===================================================================
> --- ffmpeg/libavformat/allformats.c	(revision 1323)
> +++ ffmpeg/libavformat/allformats.c	(revision 1326)
> @@ -172,4 +172,5 @@
>      REGISTER_PROTOCOL(RTP, rtp);
>      REGISTER_PROTOCOL(TCP, tcp);
>      REGISTER_PROTOCOL(UDP, udp);
> +    REGISTER_PROTOCOL(FILENO, fileno);
>  }
>   
>   

-- 
Ben
Purple Labs S.A.
www.purplelabs.com




More information about the ffmpeg-devel mailing list