container_fifo.h (4855B)
1 /* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg 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 * FFmpeg 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 FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19 #ifndef AVUTIL_CONTAINER_FIFO_H 20 #define AVUTIL_CONTAINER_FIFO_H 21 22 #include <stddef.h> 23 24 /** 25 * AVContainerFifo is a FIFO for "containers" - dynamically allocated reusable 26 * structs (e.g. AVFrame or AVPacket). AVContainerFifo uses an internal pool of 27 * such containers to avoid allocating and freeing them repeatedly. 28 */ 29 typedef struct AVContainerFifo AVContainerFifo; 30 31 enum AVContainerFifoFlags { 32 /** 33 * Signal to av_container_fifo_write() that it should make a new reference 34 * to data in src rather than consume its contents. 35 * 36 * @note you must handle this flag manually in your own fifo_transfer() 37 * callback 38 */ 39 AV_CONTAINER_FIFO_FLAG_REF = (1 << 0), 40 41 /** 42 * This and all higher bits in flags may be set to any value by the caller 43 * and are guaranteed to be passed through to the fifo_transfer() callback 44 * and not be interpreted by AVContainerFifo code. 45 */ 46 AV_CONTAINER_FIFO_FLAG_USER = (1 << 16), 47 }; 48 49 /** 50 * Allocate a new AVContainerFifo for the container type defined by provided 51 * callbacks. 52 * 53 * @param opaque user data that will be passed to the callbacks provided to this 54 * function 55 * @param container_alloc allocate a new container instance and return a pointer 56 * to it, or NULL on failure 57 * @param container_reset reset the provided container instance to a clean state 58 * @param container_free free the provided container instance 59 * @param fifo_transfer Transfer the contents of container src to dst. 60 * @param flags currently unused 61 * 62 * @return newly allocated AVContainerFifo, or NULL on failure 63 */ 64 AVContainerFifo* 65 av_container_fifo_alloc(void *opaque, 66 void* (*container_alloc)(void *opaque), 67 void (*container_reset)(void *opaque, void *obj), 68 void (*container_free) (void *opaque, void *obj), 69 int (*fifo_transfer) (void *opaque, void *dst, void *src, unsigned flags), 70 unsigned flags); 71 72 /** 73 * Allocate an AVContainerFifo instance for AVFrames. 74 * 75 * @param flags currently unused 76 */ 77 AVContainerFifo *av_container_fifo_alloc_avframe(unsigned flags); 78 79 /** 80 * Free a AVContainerFifo and everything in it. 81 */ 82 void av_container_fifo_free(AVContainerFifo **cf); 83 84 /** 85 * Write the contents of obj to the FIFO. 86 * 87 * The fifo_transfer() callback previously provided to av_container_fifo_alloc() 88 * will be called with obj as src in order to perform the actual transfer. 89 */ 90 int av_container_fifo_write(AVContainerFifo *cf, void *obj, unsigned flags); 91 92 /** 93 * Read the next available object from the FIFO into obj. 94 * 95 * The fifo_read() callback previously provided to av_container_fifo_alloc() 96 * will be called with obj as dst in order to perform the actual transfer. 97 */ 98 int av_container_fifo_read(AVContainerFifo *cf, void *obj, unsigned flags); 99 100 /** 101 * Access objects stored in the FIFO without retrieving them. The 102 * fifo_transfer() callback will NOT be invoked and the FIFO state will not be 103 * modified. 104 * 105 * @param pobj Pointer to the object stored in the FIFO will be written here on 106 * success. The object remains owned by the FIFO and the caller may 107 * only access it as long as the FIFO is not modified. 108 * @param offset Position of the object to retrieve - 0 is the next item that 109 * would be read, 1 the one after, etc. Must be smaller than 110 * av_container_fifo_can_read(). 111 * 112 * @retval 0 success, a pointer was written into pobj 113 * @retval AVERROR(EINVAL) invalid offset value 114 */ 115 int av_container_fifo_peek(AVContainerFifo *cf, void **pobj, size_t offset); 116 117 /** 118 * Discard the specified number of elements from the FIFO. 119 * 120 * @param nb_elems number of elements to discard, MUST NOT be larger than 121 * av_fifo_can_read(f) 122 */ 123 void av_container_fifo_drain(AVContainerFifo *cf, size_t nb_elems); 124 125 /** 126 * @return number of objects available for reading 127 */ 128 size_t av_container_fifo_can_read(const AVContainerFifo *cf); 129 130 #endif // AVCODEC_CONTAINER_FIFO_H