misc/winutils/include/libavutil/fifo.h
changeset 15388 262003f2e19a
parent 15387 90a79670de52
child 15389 7718bdf60d45
equal deleted inserted replaced
15387:90a79670de52 15388:262003f2e19a
     1 /*
       
     2  * This file is part of Libav.
       
     3  *
       
     4  * Libav is free software; you can redistribute it and/or
       
     5  * modify it under the terms of the GNU Lesser General Public
       
     6  * License as published by the Free Software Foundation; either
       
     7  * version 2.1 of the License, or (at your option) any later version.
       
     8  *
       
     9  * Libav is distributed in the hope that it will be useful,
       
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
       
    12  * Lesser General Public License for more details.
       
    13  *
       
    14  * You should have received a copy of the GNU Lesser General Public
       
    15  * License along with Libav; if not, write to the Free Software
       
    16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
       
    17  */
       
    18 
       
    19 /**
       
    20  * @file
       
    21  * a very simple circular buffer FIFO implementation
       
    22  */
       
    23 
       
    24 #ifndef AVUTIL_FIFO_H
       
    25 #define AVUTIL_FIFO_H
       
    26 
       
    27 #include <stdint.h>
       
    28 #include "avutil.h"
       
    29 #include "attributes.h"
       
    30 
       
    31 typedef struct AVFifoBuffer {
       
    32     uint8_t *buffer;
       
    33     uint8_t *rptr, *wptr, *end;
       
    34     uint32_t rndx, wndx;
       
    35 } AVFifoBuffer;
       
    36 
       
    37 /**
       
    38  * Initialize an AVFifoBuffer.
       
    39  * @param size of FIFO
       
    40  * @return AVFifoBuffer or NULL in case of memory allocation failure
       
    41  */
       
    42 AVFifoBuffer *av_fifo_alloc(unsigned int size);
       
    43 
       
    44 /**
       
    45  * Free an AVFifoBuffer.
       
    46  * @param f AVFifoBuffer to free
       
    47  */
       
    48 void av_fifo_free(AVFifoBuffer *f);
       
    49 
       
    50 /**
       
    51  * Reset the AVFifoBuffer to the state right after av_fifo_alloc, in particular it is emptied.
       
    52  * @param f AVFifoBuffer to reset
       
    53  */
       
    54 void av_fifo_reset(AVFifoBuffer *f);
       
    55 
       
    56 /**
       
    57  * Return the amount of data in bytes in the AVFifoBuffer, that is the
       
    58  * amount of data you can read from it.
       
    59  * @param f AVFifoBuffer to read from
       
    60  * @return size
       
    61  */
       
    62 int av_fifo_size(AVFifoBuffer *f);
       
    63 
       
    64 /**
       
    65  * Return the amount of space in bytes in the AVFifoBuffer, that is the
       
    66  * amount of data you can write into it.
       
    67  * @param f AVFifoBuffer to write into
       
    68  * @return size
       
    69  */
       
    70 int av_fifo_space(AVFifoBuffer *f);
       
    71 
       
    72 /**
       
    73  * Feed data from an AVFifoBuffer to a user-supplied callback.
       
    74  * @param f AVFifoBuffer to read from
       
    75  * @param buf_size number of bytes to read
       
    76  * @param func generic read function
       
    77  * @param dest data destination
       
    78  */
       
    79 int av_fifo_generic_read(AVFifoBuffer *f, void *dest, int buf_size, void (*func)(void*, void*, int));
       
    80 
       
    81 /**
       
    82  * Feed data from a user-supplied callback to an AVFifoBuffer.
       
    83  * @param f AVFifoBuffer to write to
       
    84  * @param src data source; non-const since it may be used as a
       
    85  * modifiable context by the function defined in func
       
    86  * @param size number of bytes to write
       
    87  * @param func generic write function; the first parameter is src,
       
    88  * the second is dest_buf, the third is dest_buf_size.
       
    89  * func must return the number of bytes written to dest_buf, or <= 0 to
       
    90  * indicate no more data available to write.
       
    91  * If func is NULL, src is interpreted as a simple byte array for source data.
       
    92  * @return the number of bytes written to the FIFO
       
    93  */
       
    94 int av_fifo_generic_write(AVFifoBuffer *f, void *src, int size, int (*func)(void*, void*, int));
       
    95 
       
    96 /**
       
    97  * Resize an AVFifoBuffer.
       
    98  * @param f AVFifoBuffer to resize
       
    99  * @param size new AVFifoBuffer size in bytes
       
   100  * @return <0 for failure, >=0 otherwise
       
   101  */
       
   102 int av_fifo_realloc2(AVFifoBuffer *f, unsigned int size);
       
   103 
       
   104 /**
       
   105  * Read and discard the specified amount of data from an AVFifoBuffer.
       
   106  * @param f AVFifoBuffer to read from
       
   107  * @param size amount of data to read in bytes
       
   108  */
       
   109 void av_fifo_drain(AVFifoBuffer *f, int size);
       
   110 
       
   111 /**
       
   112  * Return a pointer to the data stored in a FIFO buffer at a certain offset.
       
   113  * The FIFO buffer is not modified.
       
   114  *
       
   115  * @param f    AVFifoBuffer to peek at, f must be non-NULL
       
   116  * @param offs an offset in bytes, its absolute value must be less
       
   117  *             than the used buffer size or the returned pointer will
       
   118  *             point outside to the buffer data.
       
   119  *             The used buffer size can be checked with av_fifo_size().
       
   120  */
       
   121 static inline uint8_t *av_fifo_peek2(const AVFifoBuffer *f, int offs)
       
   122 {
       
   123     uint8_t *ptr = f->rptr + offs;
       
   124     if (ptr >= f->end)
       
   125         ptr = f->buffer + (ptr - f->end);
       
   126     else if (ptr < f->buffer)
       
   127         ptr = f->end - (f->buffer - ptr);
       
   128     return ptr;
       
   129 }
       
   130 
       
   131 #if FF_API_AV_FIFO_PEEK
       
   132 /**
       
   133  * @deprecated Use av_fifo_peek2() instead.
       
   134  */
       
   135 attribute_deprecated
       
   136 static inline uint8_t av_fifo_peek(AVFifoBuffer *f, int offs)
       
   137 {
       
   138     return *av_fifo_peek2(f, offs);
       
   139 }
       
   140 #endif
       
   141 
       
   142 #endif /* AVUTIL_FIFO_H */