1 /* 2 * Copyright © 2019, VideoLAN and dav1d authors 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this 9 * list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, 12 * this list of conditions and the following disclaimer in the documentation 13 * and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR 19 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 */ 26 27 /* 28 * Dav1dPlay FIFO helper 29 */ 30 31 typedef struct dp_fifo Dav1dPlayPtrFifo; 32 33 /* Create a FIFO 34 * 35 * Creates a FIFO with the given capacity. 36 * If the capacity is reached, new inserts into the FIFO 37 * will block until enough space is available again. 38 */ 39 Dav1dPlayPtrFifo *dp_fifo_create(size_t capacity); 40 41 /* Destroy a FIFO 42 * 43 * The FIFO must be empty before it is destroyed! 44 */ 45 void dp_fifo_destroy(Dav1dPlayPtrFifo *fifo); 46 47 /* Shift FIFO 48 * 49 * Return the first item from the FIFO, thereby removing it from 50 * the FIFO and making room for new entries. 51 */ 52 void *dp_fifo_shift(Dav1dPlayPtrFifo *fifo); 53 54 /* Push to FIFO 55 * 56 * Add an item to the end of the FIFO. 57 * If the FIFO is full, this call will block until there is again enough 58 * space in the FIFO, so calling this from the "consumer" thread if no 59 * other thread will call dp_fifo_shift will lead to a deadlock. 60 */ 61 void dp_fifo_push(Dav1dPlayPtrFifo *fifo, void *element); 62 63 void dp_fifo_flush(Dav1dPlayPtrFifo *fifo, void (*destroy_elem)(void *)); 64